2016-03-27 2 views
0

Привет, это моя конкретная проблема. Я попытался добавить одну кнопку на одну панель с циклом for.JButton находятся на JPanel, на котором это не должно быть

Это для цикла создания JButtons.

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, потому что первая кнопка для следующего вопроса имеет для 1 аргумента, чем JPanel, где нужно добавить, и вы 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 Кнопка Sledeće pitanje видна на этой панели программы, но это не должно быть. Это видно только в том случае, если я перемещаю указатель мыши через эту кнопку.

+0

Не просто вставить код. Какие шаги вы предприняли, чтобы отладить это? Можете ли вы точно определить, какая часть вашего кода не работает, а затем просто разместить соответствующие фрагменты? –

+0

У меня нет синтаксической ошибки, поэтому проблема логична, поэтому я считаю, что лучше всего отправлять все строки из моего кода. проблема в том, что я не вижу JButton в кадре. – GlacialMan

+0

Тем не менее, лучше всего опубликовать только любой код, который, по вашему мнению, может иметь значение. Даже если вы не знаете, какой код важен, вы должны разбить свой код на разные блоки, а между блоками кода объяснить, для чего каждый из них. –

ответ

2

Вместо setLayout(null), научиться использовать layouts в ваших интересах. В приведенном ниже примере используется серия nested layouts, чтобы добавить одну сетку внутри другой.

image

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 s для следующего и обратно."

Чтобы разрешить навигацию по кнопке с одной панели на другую, используйте CardLayout, показанный here и пересмотренный ниже.

image

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); 
    } 
} 
+0

См. Также ['GridButtonPanel'] (http://stackoverflow.com/a/7706684/230513). – trashgod

+0

О, вы меня не поняли :) Я хочу показать только одну панель и конец (южная панель), поэтому exp One label - на вопрос, 4 Radio Button для ответов и 2 JButton для следующего и обратно. Поэтому, когда кто-то нажимает дальше, он покажет другую панель, на которой есть еще один ярлык для вопросов, другие ответы и следующая и предыдущая кнопка. Я хочу иметь 10 панелей, которые будут отображаться один за другим, когда вы нажимаете на текст. Надеюсь, что вы меня поняли :) – GlacialMan

+0

Спасибо, может быть, это мне поможет :) – GlacialMan

Смежные вопросы