JButton 位于不应该在其上的 JPanel [关闭]
Posted
技术标签:
【中文标题】JButton 位于不应该在其上的 JPanel [关闭]【英文标题】:JButton are on JPanel on which it isn't should be [closed] 【发布时间】:2016-07-14 12:57:10 【问题描述】:您好,这是我的具体问题。我尝试使用 for 循环将一个按钮添加到一个面板。
这是用于创建 JButton 的 for 循环。
nizButtona=new JButton[22];
for(int i=0;i<nizButtona.length;i++)
nizButtona[i] = new JButton();
if(i==0)
nizButtona[i].setText("Započni kviz"); //Start quiz
nizButtona[i].addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
cl.next(nizPanela[1]);
);
else if(i==1)
nizButtona[i].setText("Izlaz"); //Quit
nizButtona[i].addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
System.exit(0);
);
else if(i<12)
nizButtona[i].setText("Sledeće pitanje"); //Next question, on next panel
nizButtona[i].addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
cl.next(nizPanela[1]);
);
这是在面板上添加按钮的新循环。这里 nizButtona[i-1] 是 i-1 因为下一个问题的第一个按钮比 JPanel 有 1 个参数,需要添加它,并且所有组件都是 GridBagLayout,所以我会将所有组件放在每个面板的相同位置。没有它,问题是一样的。
for(int i=3;i<=11;i++)
nizPanela[i].add(nizButtona[i-1]);
这是我为 JPanels 创建数组的方式。
nizPanela = 新 JPanel[13];
for (int i=0;i<nizPanela.length;i++ )
nizPanela[i] = new JPanel();
if(i<=1)
okvir.getContentPane().add(nizPanela[i]);//Does i real need this getContentPane?
else
nizPanela[i].setLayout(new GridBagLayout());
nizPanela[1].add(nizPanela[i], String.valueOf(i));
cl=new CardLayout();
nizPanela[1].setLayout(cl);
cl.show(nizPanela[1],"2");
这是程序的外观photo Button Sledeće pitanje 在此面板上可见,但不应该如此。只有当我将鼠标指针移动到此按钮的位置时,它才可见。
【问题讨论】:
不要只是粘贴代码。您采取了哪些步骤来调试此问题?你能确定你的代码的哪一部分不工作,然后发布相关的 sn-ps 吗? 我没有语法错误,所以问题是合乎逻辑的,所以我认为最好从我的代码中发布所有行。问题是:我在 Frame 上看不到 JButton。 不过,最佳做法是只发布您认为可能相关的任何代码。即使您不知道哪些代码很重要,您也应该将代码分成不同的块,并在代码块之间解释每个代码块的用途。 顺便说一句@LukeTaylor OP 提供的是minimal reproducible example。在不到 100 行代码的情况下,它(出于所有意图和目的)是最少的。它是完整的(无需任何更改或额外的库即可编译),可验证并且是问题的示例(我们可以运行代码来查看问题)。 @AndrewThompson 谢谢。我真的只是反对发布没有关于每个部分的用途的代码。我明白你关于 【参考方案1】:不要使用setLayout(null)
,而是学会使用layouts 来发挥自己的优势。下面的示例使用一系列nested layouts 在另一个网格中添加一个网格。
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
/**
* @see https://***.com/a/36243395/230513
*/
public class Test
private static final int ROW = 2;
private static final int COL = 5;
private void display()
JFrame f = new JFrame("Test");
f.setLayout(new GridLayout(0, 1));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel top = new JPanel(new GridBagLayout());
top.setBackground(Color.darkGray);
JLabel label = new JLabel("Post no bills.");
label.setForeground(Color.yellow);
top.add(label);
f.add(top);
f.add(createGridPanel());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
private JPanel createGridPanel()
JPanel p = new JPanel(new GridLayout(ROW, COL, 5, 5));
p.setBorder(BorderFactory.createLineBorder(Color.yellow,5));
p.setBackground(Color.yellow);
for (int r = 0; r < ROW; r++)
for (int c = 0; c < COL; c++)
p.add(createSubPanel());
return p;
private JPanel createSubPanel()
JPanel p = new JPanel(new GridLayout(0, 1));
JPanel top = new JPanel();
top.add(new JButton("One"));
top.add(new JButton("Two"));
JPanel bot = new JPanel();
bot.add(new JRadioButton("A"));
bot.add(new JRadioButton("B"));
bot.add(new JRadioButton("C"));
bot.add(new JRadioButton("D"));
p.add(top);
p.add(bot);
return p;
public static void main(String[] args)
EventQueue.invokeLater(new Test()::display);
附录:“我想要……两个JButton
s 用于下一个和后一个。”
要允许通过按钮从一个面板导航到另一个面板,请使用CardLayout
,显示为here,并在下面进行了修订。
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
/**
* @see https://***.com/a/36243395/230513
*/
public class CardPanel extends JPanel
private static final JPanel cards = new JPanel(new CardLayout());
private final String name;
public CardPanel(String name)
super(new GridLayout(0, 1));
this.name = name;
JPanel top = new JPanel(new GridBagLayout());
top.setBackground(Color.darkGray);
JLabel label = new JLabel(name);
label.setForeground(Color.yellow);
top.add(label);
JPanel bot = new JPanel();
bot.setBorder(BorderFactory.createLineBorder(Color.yellow, 5));
bot.add(new JRadioButton("A"));
bot.add(new JRadioButton("B"));
bot.add(new JRadioButton("C"));
bot.add(new JRadioButton("D"));
this.add(top);
this.add(bot);
@Override
public String toString()
return name;
public static void main(String[] args)
EventQueue.invokeLater(new Runnable()
@Override
public void run()
create();
);
private static void create()
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for (int i = 1; i < 9; i++)
CardPanel p = new CardPanel("Panel " + String.valueOf(i));
cards.add(p, p.toString());
JPanel control = new JPanel();
control.add(new JButton(new AbstractAction("\u22b2Prev")
@Override
public void actionPerformed(ActionEvent e)
CardLayout cl = (CardLayout) cards.getLayout();
cl.previous(cards);
));
control.add(new JButton(new AbstractAction("Next\u22b3")
@Override
public void actionPerformed(ActionEvent e)
CardLayout cl = (CardLayout) cards.getLayout();
cl.next(cards);
));
f.add(cards, BorderLayout.CENTER);
f.add(control, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
【讨论】:
另见GridButtonPanel
。
哦,你不理解我 :) 我只想显示一个面板和结尾(南面板)所以 exp 一个标签 - 用于问题,4 个单选按钮用于答案,2 个 JButton 用于下一个和背部。因此,当有人单击下一步时,它将显示另一个面板,其中有另一个问题标签、另一个答案以及下一步和返回按钮。我想要有 10 个面板,当单击文本时会一一显示。我希望你能理解我:)
谢谢,也许它会帮助我:)
赞this?
是的,非常感谢:)以上是关于JButton 位于不应该在其上的 JPanel [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
当面板中的 JButton 悬停时,JPanel 上的 MouseExited 运行?