JButton在JPanel上,它不应该

嗨,这是我的具体问题。 我试图通过for循环向一个面板添加一个按钮。

这是用于创建JButton的循环。

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]); } 

以下是我为JPanel创建数组的方法。

nizPanela = new 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"); 

这是程序看起来照片按钮Sledećepitanje在这个面板上可见,但它不应该。 只有当我将鼠标指针移动到此按钮的位置时,它才可见。

而不是setLayout(null) ,学习使用布局对您有利。 下面的示例使用一系列嵌套布局在另一个网格中添加一个网格。

图片

 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://stackoverflow.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 。”

要允许按钮从一个面板导航到另一个面板,请使用CardLayout , 此处显示并在下面进行修订。

图片

 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://stackoverflow.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); } }