如何在JFrame中正确调整按钮的大小和位置?

时间:2016-01-17 09:19:24

标签: java swing layout-manager

我正在尝试使用Java和JFrame创建一个PC应用程序。我试图格式化2个透明按钮,每个尺寸显示整个屏幕的一半(垂直)。屏幕的上半部分将保留用于辩论某人的选项,如果点击,屏幕的下半部分将保留观看辩论的选项。以下是我到目前为止的情况:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class BackgroundImageJFrame extends JFrame {
   JButton b1;
   JButton b2;
   JPanel j1;
   JPanel j2;

   public BackgroundImageJFrame() {
      setTitle("Background Color for JFrame");
      setSize(340,563);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setVisible(true);
      setLayout(null);
/*
    One way
    -----------------
    setLayout(new BorderLayout());
    JLabel background=new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads\\colorful design.png"));
    add(background);
    background.setLayout(new FlowLayout());
    l1=new JLabel("Here is a button");
    b1=new JButton("I am a button");
    background.add(l1);
    background.add(b1);
*/
// Another way
      setLayout(new BorderLayout());
      setContentPane(new JLabel(new ImageIcon("C:\\Users\\MLH-User\\Downloads\\Front.jpg")));
      setLayout(new FlowLayout());
      j1 = new JPanel();
      j1.setLayout(null);
      b1 = new JButton("Spectate");
      //b1.setBounds(0,0,50,50);
      b1.setOpaque(false);
      b1.setContentAreaFilled(false);
      b1.setBorderPainted(false);
      j1.add(b1);

      b2 = new JButton("Debate");



      b2.setLocation(0,0);
      b2.setOpaque(false);
      b2.setContentAreaFilled(false);
      b2.setBorderPainted(false);
      j1.add(b2);
      add(j1);
    // Just for refresh :) Not optional!
      setSize(339,562);
      setSize(340,563);
    }
    public static void main(String args[])   {
      new BackgroundImageJFrame();
    }
} 

这是我到目前为止尝试过的一些内容,任何人都可以帮我解决我哪里出错了吗?

enter image description here

2 个答案:

答案 0 :(得分:2)

您应该使用布局管理器。以下是GridLayout的示例:

enter image description here

public class Example extends JFrame {

    private static final int SIZE = 300;

    public Example() {

        setLayout(new GridLayout(2, 1, 0, 5));
        getContentPane().setBackground(Color.WHITE);

        JButton debate = new JButton("DEBATE") {

            public Dimension getPreferredSize() {

                return new Dimension(SIZE, SIZE);
            }
        };
        Font font = debate.getFont().deriveFont(30f);
        debate.setFont(font);
//      debate.setBorderPainted(false);
        debate.setBackground(Color.BLUE.brighter());
        debate.setForeground(Color.WHITE);

        JButton spectate = new JButton("SPECTATE") {

            public Dimension getPreferredSize() {

                return new Dimension(SIZE, SIZE);
            }
        };
        spectate.setFont(font);
//      spectate.setBorderPainted(false);
        spectate.setBackground(Color.RED.brighter());
        spectate.setForeground(Color.WHITE);

        add(debate);
        add(spectate);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(final String[] args) {

        SwingUtilities.invokeLater(() -> new Example());
    }
}

备注:

  • 您必须意识到屏幕尺寸会有所不同。将SIZE设置为300是演示的任意选择,屏幕可能没有所需的大小。您也可以设置insets或空边框,而不是直接指定组件的大小。
  • 如果您有更多这些按钮,可以考虑为这些按钮创建一个类。

答案 1 :(得分:-1)

这是设置尺寸的示例。我不知道位置部分。

    JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new GridLayout(4,4,4,4));

for(int i=0 ; i<16 ; i++){
    JButton btn = new JButton(String.valueOf(i));
    btn.setPreferredSize(new Dimension(40, 40));
    panel.add(btn);
}
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);