gpt4 book ai didi

java - 按钮不创建 JPanel

转载 作者:行者123 更新时间:2023-12-02 06:12:30 25 4
gpt4 key购买 nike

我是 Java 新手,正在为我的大学做一些窗口应用程序。我正在尝试在开始时执行某种带有三个按钮的菜单,当单击其中一个按钮时,它应该创建一个带有另外两个按钮的 JPanel,但我的代码不起作用。

这是代码:

import java.awt.*;

public class mainScreen extends JFrame {

private JPanel contentPane;

public mainScreen() {
super("Aplikacija za atletska natjecanja");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(0, 0, screenSize.width, screenSize.height);
contentPane = new JPanel();
contentPane.setBackground(SystemColor.info);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(null);
setContentPane(contentPane);

JPanel top = new JPanel();
top.setBounds(200, 11, screenSize.width - 400, screenSize.height - (screenSize.height - 100));
contentPane.add(top);

JPanel mainMenu = new JPanel();
mainMenu.setBounds(200, 110, screenSize.width - 400, screenSize.height - (screenSize.height - 30));
contentPane.add(mainMenu);
mainMenu.setLayout(new GridLayout(1, 0, 0, 0));

JButton btnTrkacke = new JButton("Trka\u010Dke");
btnTrkacke.setBackground(SystemColor.text);
mainMenu.add(btnTrkacke);
btnTrkacke.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

JPanel panTrk = new JPanel();
panTrk.setBounds(201, 140, (screenSize.width - 400) / 3, 30);
contentPane.add(panTrk);
panTrk.setLayout(new GridLayout(1, 0, 0, 0));

JButton btnTrkAtl = new JButton("Atleti\u010Dari");
btnTrkAtl.setBackground(SystemColor.text);
panTrk.add(btnTrkAtl);

JButton btnTrkDisc = new JButton("Discipline");
btnTrkDisc.setBackground(SystemColor.text);
panTrk.add(btnTrkDisc);
}
});

JButton btnSkakacke = new JButton("Skaka\u010Dke");
btnSkakacke.setBackground(SystemColor.text);
mainMenu.add(btnSkakacke);

JButton btnBacacke = new JButton("Baca\u010Dke");
btnBacacke.setBackground(SystemColor.text);
mainMenu.add(btnBacacke);
}
}

当我单击其他两个按钮时,也应该创建相同的面板,但在其他位置...为该 Pane 创建类然后在单击按钮时调用它是否更好?

最佳答案

更改组件后,您忘记在 contentPane 上调用 revalidate 和 repaint:

contentPane.revalidate();
contentPane.repaint();

例如,

     @Override
public void actionPerformed(ActionEvent e) {

JPanel panTrk = new JPanel();
panTrk.setBounds(201, 140, (screenSize.width - 400) / 3, 30);
contentPane.add(panTrk);
panTrk.setLayout(new GridLayout(1, 0, 0, 0));

JButton btnTrkAtl = new JButton("Atleti\u010Dari");
btnTrkAtl.setBackground(SystemColor.text);
panTrk.add(btnTrkAtl);

JButton btnTrkDisc = new JButton("Discipline");
btnTrkDisc.setBackground(SystemColor.text);
panTrk.add(btnTrkDisc);

contentPane.revalidate(); // ***** added *****
contentPane.repaint(); // ***** added *****
}
  • revalidate 告诉容器重新布局其组件。
  • repaint 向绘制管理器请求重新绘制组件和所有子组件。

顺便说一句:您正在使用空布局管理器和 setBounds(...) 的绝对定位,并且您确实不想这样做。虽然对于新手来说,这似乎是创建复杂 GUI 的最佳方式,但您处理 Swing GUI 创建的次数越多,您就越会发现这样做会使您的 GUI 陷入困境,将其绘制在一个非常狭窄的角落,并使很难扩展或增强。只是不要这样做。

关于java - 按钮不创建 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21766033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com