2016-12-21 85 views
1

所以我最近开始学习面向对象的编程,在Java中做了大部分基本的东西,现在我想从控制台编写改为实际的GUI。如何使用Java Swing制作GUI

但是我有问题了解它是如何工作的,我在oracle文档中看过所有的东西,但是他们的例子并不那么清晰易懂,也使用了它,但找不到任何好的解释。这是我最后的手段。

这里是我的我的程序GUI应该是什么样子的想法: [这样的] [1]

我不能得出很不错,但所有的复选框应该保持一致!

如果有人能提供给我的代码,将是巨大的,如果不只是一些很好的解释会帮我了很多的解释,我的问题是,当我1米对齐的东西以外得到弄糟。

我当前的代码:

public class Zadatak2 extends JFrame{ 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 


     new Zadatak2(); 

    } 


    public Zadatak2(){ 

     JPanel panel1 = new JPanel(); 
     setSize(500, 250); 
     setLocationRelativeTo(null); 
     add(panel1); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 




     BorderLayout border1 = new BorderLayout(); 
     panel1.setLayout(border1); 


     JPanel panel2 = new JPanel(); 
     GridLayout grid1 = new GridLayout(3,2); 

     panel2.setLayout(grid1); 
     panel2.add(new JCheckBox("Bold")); 
     panel2.add(new JCheckBox("Italic")); 
     panel2.add(new JCheckBox("Underline")); 


     panel1.add(panel2,BorderLayout.WEST); 



     JPanel panel3 = new JPanel(); 
     GridLayout grid2 = new GridLayout(4,1); 
     panel3.setLayout(grid2); 
     panel3.add(new JCheckBox("Strikerthrough")); 
     panel3.add(new JCheckBox("Teletype")); 
     panel3.add(new JCheckBox("Emphasis")); 
     panel3.add(new JCheckBox("Strong")); 
     panel1.add(panel3,BorderLayout.CENTER); 

     JPanel panel4 = new JPanel(); 
     BorderLayout border2 = new BorderLayout(); 
     panel4.setLayout(border2); 

     panel4.add(new JButton("Apply"), BorderLayout.EAST); 
     panel4.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 70)); 
     panel1.add(panel4,BorderLayout.SOUTH); 

     JPanel panel5 = new JPanel(); 
     GridLayout grid3 = new GridLayout(2,1); 
     panel5.setLayout(grid3); 
     panel5.add(new JLabel("Sample text")); 
     JTextArea ta = new JTextArea("Sample text"); 
     panel5.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 30)); 
     ta.setSize(200, 200); 
     panel5.add(ta); 
     panel1.add(panel5,BorderLayout.EAST); 


     setVisible(true); 
    } 

} 

感谢所有人的帮助下,终于做出了正确的图形用户界面,现在我明白变薄好得多。

+0

确定加入的,现在怎么看起来码和形象,从而你们可以看到我需要帮助对齐复选框并对齐该文本区域 – FilipRistic

+1

对齐是您的问题中最少的。我会弄清楚如何使其余部分与后端一起工作。 – duffymo

+1

我想学习如何首先使用Swing,然后我会做逻辑,我想知道如何使它工作,因为对于下一个项目,我打算制作需要良好格式化的国际象棋游戏。 – FilipRistic

回答

3

要将复选框放置在GridLayout中,您不应为每列定义面板。只是定义,把它们像这样:

JPanel panel2 = new JPanel(); 
GridLayout grid1 = new GridLayout(4, 2); 

panel2.setLayout(grid1); 
panel2.add(new JCheckBox("Bold")); 
panel2.add(new JCheckBox("Strikerthrough")); 
panel2.add(new JCheckBox("Italic")); 
panel2.add(new JCheckBox("Teletype")); 
panel2.add(new JCheckBox("Underline")); 
panel2.add(new JCheckBox("Emphasis")); 
panel2.add(new JLabel("")); // fill the empty cell with an empty label 
panel2.add(new JCheckBox("Strong")); 

不过,既然你有一个TextArea应该与复选框对齐并跨越几行,我会电子书籍使用GridBagLayout代替。这是更多的代码编写,但比GridLayout更灵活。

一个例子:

public Zadatak2() { 

    JPanel panel1 = new JPanel(); 
    setSize(500, 250); 
    setLocationRelativeTo(null); 
    add(panel1); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setVisible(true); 

    BorderLayout border1 = new BorderLayout(); 
    panel1.setLayout(border1); 

    JPanel panel2 = new JPanel(); 
    GridBagLayout grid1 = new GridBagLayout(); 

    panel2.setLayout(grid1); 
    panel2.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 

    Insets insets = new Insets(2, 2, 2, 2); 

    GridBagConstraints c = new GridBagConstraints(); 
    c.gridx = 0; 
    c.gridy = 0; 
    c.insets = insets; 
    c.anchor = GridBagConstraints.WEST; 
    panel2.add(new JCheckBox("Bold"), c); 

    c = new GridBagConstraints(); 
    c.gridx = 1; 
    c.gridy = 0; 
    c.insets = insets; 
    c.anchor = GridBagConstraints.WEST; 
    panel2.add(new JCheckBox("Strikerthrough"), c); 

    c = new GridBagConstraints(); 
    c.gridx = 0; 
    c.gridy = 1; 
    c.insets = insets; 
    c.anchor = GridBagConstraints.WEST; 
    panel2.add(new JCheckBox("Italic"), c); 

    c = new GridBagConstraints(); 
    c.gridx = 1; 
    c.gridy = 1; 
    c.insets = insets; 
    c.anchor = GridBagConstraints.WEST; 
    panel2.add(new JCheckBox("Teletype"), c); 

    c = new GridBagConstraints(); 
    c.gridx = 0; 
    c.gridy = 2; 
    c.insets = insets; 
    c.anchor = GridBagConstraints.WEST; 
    panel2.add(new JCheckBox("Underline"), c); 

    c = new GridBagConstraints(); 
    c.gridx = 1; 
    c.gridy = 2; 
    c.insets = insets; 
    c.anchor = GridBagConstraints.WEST; 
    panel2.add(new JCheckBox("Emphasis"), c); 

    c = new GridBagConstraints(); 
    c.gridx = 1; 
    c.gridy = 3; 
    c.insets = insets; 
    c.anchor = GridBagConstraints.WEST; 
    panel2.add(new JCheckBox("Strong"), c); 

    insets = new Insets(2, 40, 2, 2); 
    c = new GridBagConstraints(); 
    c.gridx = 2; 
    c.gridy = 0; 
    c.insets = insets; 
    c.anchor = GridBagConstraints.WEST; 
    panel2.add(new JLabel("Sample text"), c); 

    c = new GridBagConstraints(); 
    c.gridx = 2; 
    c.gridy = 1; 
    c.insets = insets; 
    c.weightx = .5; 
    c.fill = GridBagConstraints.BOTH; 
    c.gridheight = 3; 
    JTextArea ta = new JTextArea("Sample text", 4, 4); 
    JScrollPane sp = new JScrollPane(ta); 
    panel2.add(sp, c); 

    c = new GridBagConstraints(); 
    c.gridx = 2; 
    c.gridy = 5; 
    c.insets = new Insets(40, 40, 2,2); 
    c.anchor = GridBagConstraints.WEST; 
    panel2.add(new JButton("Apply"), c); 


    panel1.add(panel2, BorderLayout.CENTER); 

    pack(); 

    setVisible(true); 
} 

结果:

Screenshot of UI using GridBagLayout

请参阅GridBagLayoutTutorialJavaDoc学习此布局的所有选项。

+0

我不得不承认我的Java Swing有点生疏,现在我使用JavaFX(如果您有选择,我推荐使用JavaFX)。 –

+0

对我来说看起来不错,1+,但一定要设置JTextArea的行和列属性(构造函数可以为你做),并将其放置在JScrollPane中。另外,应该在填充组件之后并在将其设置为可见之前,在JFrame上调用pack()。 –

+0

@HovercraftFullOfEels好点。添加了JScrollPane并打包,谢谢! –

2

请记住使用其自己的布局嵌套JPanel。例如,您的图像图形用户界面可以成为多种方式之一。整体JPanel可以使用面向线的BoxLayout,左边有一个使用JPanel的GridLayout,使用JPanel的右边的BorderLayout。例如:

enter image description here

其他问题:

  • 的JTextArea中应放入一个JScrollPane,然后滚动面板添加到GUI。
  • 从不从不设置文本组件的大小或首选大小,尤其是JTextAreas,因为这会阻止它们正常工作,特别是在滚动窗格内时。
  • 改为设置JTextArea的列和行属性。
  • 避免一般设置尺寸。让GUI组件和布局在添加所有内容并将其设置为可见之前,通过在JFrame上调用pack()来设置它们自己的大小。

例如,只需稍作修改:

import java.awt.BorderLayout; 
import java.awt.Font; 
import java.awt.GridLayout; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class SimpleGui extends JPanel { 
    private static final String[] CHK_BOX_TEXTS = {"Monday", "Tuesday", "Wednesday", 
      "Thursday", "Friday", "Saturday", "Sunday"}; 
    private String title = "My Title"; 
    private JTextArea textArea = new JTextArea(10, 30); 
    private JButton applyButton = new JButton("Apply"); 

    public SimpleGui() { 
     // gridlayout with 2 columns, variable rows 
     JPanel checkBoxPanel = new JPanel(new GridLayout(0, 2, 4, 4)); 
     for (String chkBoxText : CHK_BOX_TEXTS) { 
      checkBoxPanel.add(new JCheckBox(chkBoxText)); 
     } 
     JPanel leftPanel = new JPanel(); 
     leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS)); 
     leftPanel.add(Box.createVerticalStrut(20)); 
     leftPanel.add(checkBoxPanel); 
     leftPanel.add(Box.createGlue());   

     JLabel titleLabel = new JLabel(title, SwingConstants.CENTER); 
     titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD, 20)); 
     JScrollPane scrollPane = new JScrollPane(textArea); 
     JPanel btnPanel = new JPanel(); 
     btnPanel.add(applyButton); 

     JPanel rightPanel = new JPanel(new BorderLayout(5, 5)); 
     rightPanel.add(titleLabel, BorderLayout.PAGE_START); 
     rightPanel.add(scrollPane, BorderLayout.CENTER); 
     rightPanel.add(btnPanel, BorderLayout.PAGE_END);   

     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS)); 
     add(leftPanel); 
     add(rightPanel); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("SimpleGui"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new SimpleGui()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

其中为显示:

enter image description here

+0

看起来不错! (已为其+1) –

+0

@ModusTollens:感谢1+,但我将其创建为社区wiki,这意味着代表不计数(如果您不熟悉社区wiki概念),任何人都可以编辑和改进它。 –

+0

......有人对它进行了低估(?),但它又不算数,但很奇怪,因为它被认为是一个社区答案。去搞清楚。 –