【问题标题】:How to fix JButton Location如何修复 JButton 位置
【发布时间】:2015-06-27 15:48:21
【问题描述】:

之前我问过一个关于这个程序的问题,我和你们一起解决了这个问题。现在我在第一个包含形状游戏的面板上创建了新面板。所以我尝试在新面板上设置 JButton。但我无法更改 Jbuttons 的位置。 我正在尝试设置新面板的中心。我已经尝试过 FLowLayout()、BorderLayout() 和 setBounds();出了点问题。

以前的问题; How to move JFrame shape

public class myshapestry extends JFrame implements ActionListener {

JFrame frame=new JFrame("Deneme");

 Startthegame panelstart= new Startthegame();
Container l ;

JLabel statusbar = new JLabel("default");
static JButton start;
static JButton exit;

 myshapestry() {

     l=this.getContentPane();
     this.setLayout(null);

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.pack();
     frame.setLocationRelativeTo(null);

     frame.add(panelstart);
     frame.add(statusbar, BorderLayout.SOUTH);

        frame.setVisible(true);
        frame.setSize(getPreferredSize());

       start = new JButton("Start");
       exit = new JButton("Exit");


       panelstart.add(start);
       panelstart.add(exit);




    }

 public Dimension getPreferredSize() {
       return new  Dimension(500,600);
   }

   public static void main (String args[]){
       myshapestry tr=new myshapestry();
       tr.setTitle("Game of Shapes");

    } 

   public class Startthegame extends JPanel {

   }







   }

【问题讨论】:

  • 如果是上一个问题的延续,请在问题中添加该链接
  • 使用panelstart.add(start, BorderLayout.CENTER);
  • 我已经尝试过了,但我没有得到正确的结果
  • 您正在创建JFrame 的两个实例,这非常令人困惑,请删除extends JFramestatic 不是你的朋友,尽量避免。

标签: java swing jbutton layout-manager


【解决方案1】:

您从JFrame 扩展,但在类中创建JFrame 的新实例并与两者交互,这只是混淆了问题。从摆脱 extends JFrame 开始,您并没有向该类添加任何新功能,它只是将您锁定在一个用例中

static 不是你的朋友,你应该尽可能避免使用它。在这种情况下,您可以将按钮移动到Startthegame。这是工作单元隔离责任的基本 OO 原则。

要让按钮在容器内水平和垂直居中,您可以使用GridBagLayout

public class Startthegame extends JPanel {

    private JButton start;
    private JButton exit;

    public Startthegame() {
        setLayout(new GridBagLayout());

        start = new JButton("Start");
        exit = new JButton("Exit");

        add(start);
        add(exit);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500, 600);
    }

}

您还应该在建立基本 UI 之后调用 setVisible,否则您可能会遇到未显示的组件

例如...

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MyShapesTry {

    JFrame frame = new JFrame("Deneme");

    Startthegame panelstart = new Startthegame();
    Container l;

    JLabel statusbar = new JLabel("default");

    public MyShapesTry() {

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(panelstart);
        frame.add(statusbar, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                MyShapesTry tr = new MyShapesTry();
            }
        });
    }

}

【讨论】:

  • 好的,非常感谢,我同意你的观点,直到主要课程。在主要课程中,我遇到了错误。错误是包含} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); }
  • 我正在使用 JavaSe 1.7
  • 嗯,multi-catch 是 1.7 的一个特性。确切的错误是什么
  • 你能解释一下这个块吗? EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); }
  • 听起来像是您没有导入正确的异常,或者您正在编译到低于 1.7 的 Java 版本。 invokeLater 块与 Initial Threads 相关联
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2019-09-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多