2013-03-18 43 views
2

正常顯示,請參見下面的SSCCE:我使用「系統」外觀和感覺的JTextField在JToolBar中 - 不能在Linux和Windows

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 

import javax.swing.Box; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JToolBar; 
import javax.swing.UIManager; 
import javax.swing.border.EtchedBorder; 


@SuppressWarnings("serial") 
public class GlueTest extends JComponent { 

    private JFrame frame; 
    private JToolBar toolbar; 
    private JLabel label_1; 
    private JTextField textField_1; 
    private JLabel label_2; 
    private JTextField textField_2; 

    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        GlueTest window = new GlueTest(); 
        window.frame.setVisible(true); 
        window.frame.requestFocusInWindow(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public GlueTest() { 
     initialize(); 
    } 

    private void initialize() { 
     frame = new JFrame("Test"); 
     frame.setBounds(0,0,800,600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     toolbar = new JToolBar(); 
     toolbar.setFloatable(false); 
     toolbar.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null)); 
     toolbar.setMaximumSize(new Dimension(frame.getWidth(), frame.getHeight())); 
     frame.getContentPane().add(toolbar, BorderLayout.NORTH); 

     Component horizontalGlue = Box.createHorizontalGlue(); 
     toolbar.add(horizontalGlue); 

     label_1 = new JLabel(" 1 "); 
     toolbar.add(label_1); 

     textField_1 = new JTextField(); 
     textField_1.setColumns(9); 
     textField_1.setMaximumSize(textField_1.getPreferredSize()); 
     toolbar.add(textField_1); 

     label_2 = new JLabel(" 2 "); 
     toolbar.add(label_2); 

     textField_2 = new JTextField(); 
     textField_2.setColumns(9); 
     textField_2.setMaximumSize(textField_2.getPreferredSize()); 
     toolbar.add(textField_2); 
    } 
} 

通知。在Windows 7中,它完美顯示。文本字段會自動調整到最大尺寸,並且左側的水平膠會盡可能增大,從而強制它們對齊。

enter image description here

然而,在Linux操作系統(Ubuntu的12.04,如果它事項),它結束了方式不同。文本字段從框架滾動!水平膠水本身太大。

enter image description here

我已經嘗試過其他幾種不同的方式來得到它在兩個正常顯示,沒有運氣。實際上,在Linux下正確顯示它的唯一方法是刪除文本字段的所有樣式(最大寬度,列等),然後成功不滾動框架,但它沒用,因爲它只有幾個像素的寬度。

作爲一個旁註,我甚至沒有機會嘗試在Mac OS上,但我很好奇結果如何

+0

,如果你不使用'system'的外觀和感覺,會發生什麼? – 2013-03-18 08:18:13

+0

@JeanHominal好問題。只是用'Metal'的外觀和感覺來試用它,它在Linux上運行良好。 – The111 2013-03-18 08:21:20

+0

在添加組件結束時,不要調用'frame.setBounds(0,0,800,600);'調用'frame.pack()'。另外刪除'toolbar.setMaximumSize(new Dimension(frame.getWidth(),frame.getHeight()));'。 GUI是否像你期望的那樣出現在* nix上? – 2013-03-18 08:38:00

回答

2

問題(不是*** nix的用戶),你有這個代碼

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.Box; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.JToolBar; 
import javax.swing.border.EtchedBorder; 

@SuppressWarnings("serial") 
public class GlueTest extends JComponent { 

    private JFrame frame; 
    private JToolBar toolbar; 
    private JLabel label_1; 
    private JTextField textField_1; 
    private JLabel label_2; 
    private JTextField textField_2; 

    public GlueTest() { 
     toolbar = new JToolBar(); 
     toolbar.setFloatable(false); 
     toolbar.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null)); 
     toolbar.setAlignmentY(TOP_ALIGNMENT); 
     toolbar.add(Box.createHorizontalGlue()); 

     label_1 = new JLabel(" 1 ");   
     toolbar.add(label_1); 
     toolbar.add(Box.createRigidArea(new Dimension(10,1))); 

     textField_1 = new JTextField(); 
     textField_1.setColumns(9); 
     textField_1.setMaximumSize(textField_1.getPreferredSize()); 
     toolbar.add(textField_1); 
     toolbar.add(Box.createHorizontalStrut(10)); 

     label_2 = new JLabel(" 2 "); 
     toolbar.add(label_2); 
     toolbar.add(Box.createRigidArea(new Dimension(10,1))); 

     textField_2 = new JTextField(); 
     textField_2.setColumns(9); 
     textField_2.setMaximumSize(textField_2.getPreferredSize()); 
     toolbar.add(textField_2); 
     toolbar.add(Box.createHorizontalStrut(10)); 

     frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(toolbar, BorderLayout.NORTH); 
     frame.add(new JTextArea(10, 40)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       GlueTest window = new GlueTest(); 
      } 
     }); 
    } 
} 

開關相同的問題BUILT_IN的BoxLayout到的borderlayout

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.JToolBar; 
import javax.swing.border.EtchedBorder; 

@SuppressWarnings("serial") 
public class GlueTest extends JComponent { 

    private JFrame frame; 
    private JToolBar toolbar; 
    private JLabel label_1; 
    private JTextField textField_1; 
    private JLabel label_2; 
    private JTextField textField_2; 

    public GlueTest() { 
     toolbar = new JToolBar(); 
     toolbar.setFloatable(false); 
     toolbar.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null)); 
     toolbar.setLayout(new BorderLayout(10, 10)); 
     JPanel panel = new JPanel(); 
     panel.setOpaque(false); 
     label_1 = new JLabel("1");   
     panel.add(label_1); 
     textField_1 = new JTextField(); 
     textField_1.setColumns(9); 
     panel.add(textField_1); 
     label_2 = new JLabel("2"); 
     panel.add(label_2); 
     textField_2 = new JTextField(); 
     textField_2.setColumns(9); 
     panel.add(textField_2); 
     toolbar.add(panel, BorderLayout.EAST); 
     frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(toolbar, BorderLayout.NORTH); 
     frame.add(new JTextArea(10, 40)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       GlueTest window = new GlueTest(); 
      } 
     }); 
    } 
} 
+0

是的,同樣的問題。和我的版本一樣,只有在使用'系統'外觀時才存在。 – The111 2013-03-18 09:31:11

+0

然後必須有一些問題與built_in BoxLayout,將此佈局更改爲BorderLayout,將編輯此帖子 – mKorbel 2013-03-18 09:35:21

+0

謝謝。我正在上牀睡覺,但是你的代碼的一個快速測試運行似乎是它的伎倆。Upvote現在,將明天更廣泛地玩耍,並接受答案,如果我找不到更多的問題。 :-)奇怪的是在Java盒子佈局中找到這樣一個糟糕的錯誤。 – The111 2013-03-18 09:47:50

3

作爲替代方案,可以考慮改變JToolBar佈局到FlowLayout.RIGHT

Ubuntu screenshot

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.JToolBar; 
import javax.swing.border.EtchedBorder; 

public class Test extends JComponent { 

    public Test() { 
     JToolBar toolbar = new JToolBar(); 
     toolbar.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null)); 
     toolbar.setLayout(new FlowLayout(FlowLayout.RIGHT)); 
     toolbar.add(new JLabel("1")); 
     toolbar.add(new JTextField(9)); 
     toolbar.add(new JLabel("2")); 
     toolbar.add(new JTextField(9)); 

     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(toolbar, BorderLayout.NORTH); 
     frame.add(new JTextArea(10, 40)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Test window = new Test(); 
      } 
     }); 
    } 
} 
+0

儘可能最簡單,請做OPs代碼在你的環境也造成同樣的問題 – mKorbel 2013-03-18 17:21:38

+0

感謝垃圾箱,這是一個不錯的想法,不幸的是我的SSCCE有點簡單,因爲它掩蓋了事實,我的真實應用程序也有左對齊的按鈕,因此水平膠水。 @camickr在上面OP的評論中發現了我認爲的真正問題。 – The111 2013-03-18 17:30:44

+0

是的,但我(不小心)假設了一個默認的「BoxLayout」。 – trashgod 2013-03-18 17:31:25