2015-12-12 2 views
1

Я создал эту простую программу. моя проблема в том, что я хочу отображать панели других классов без открытия нового JFrame. но я не мог создать какое-либо решение. может ли кто-нибудь сделать простой код, чтобы показать, как получить доступ к панелям других классов и заменить текущую панель?Как показать панели других классов в cardlayout?

package cardlayout; 

import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Clayou { 

    private JFrame jf = new JFrame("card layout"); 
    private JPanel jp = new JPanel(); 
    private JPanel jp1 = new JPanel(); 
    private JPanel jp2 = new JPanel(); 
    private JButton jb1 = new JButton("second"); 
    private JButton jb2 = new JButton("first"); 
    private CardLayout cl = new CardLayout(); 

    Clayou() { 

     jp.setLayout(cl); 
     jp1.add(jb1); 
     jp2.add(jb2); 

     jp1.setBackground(Color.black); 
     jp2.setBackground(Color.white); 

     jp.add(jp1, "1"); 
     jp.add(jp2, "2"); 

     cl.show(jp, "1"); 

     jb1.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       cl.show(jp, "2"); 

      } 
     }); 
     jb2.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       cl.show(jp, "1"); 

      } 
     }); 
     jf.add(jp); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.pack(); 
     jf.setVisible(true); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Clayou(); 
      } 
     }); 
    } 
} 
+0

Я не уверен, что вы имеете в виду? Как насчет интерфейса с методом для извлечения панели? 'public interface HasPanel {Component getPanel(); } ' – WalterM

+0

хорошо я до сих пор не эксперт в ООП , так что я не получил то, что вы сказали эта программа имеет две панели в этом классе, и при нажатии кнопки соответствующей одна панель заменяет другую я хочу создать панель (s) в другом классе и заменить эти панели этой панелью, но без создания нового JFrame. я надеюсь, что у вас есть мой вопрос –

ответ

1

Я только что ответил на вопрос, который может также иметь тот же ответ, что и этот. Changing panels in gui Я думаю, что это тоже поможет вам. Существует карта классов, которую вы расширяете, чтобы допускать большее количество типов карт. Для этого примера я сделал два типа карт.

импорт

import javax.swing.*; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 
import java.awt.*; 
import java.util.Vector; 

главный класс

public class Gui extends JFrame implements ListSelectionListener { 

    Vector<String> menuList = new Vector<>(); 
    JList<String> menu = new JList<>(menuList); 

    JPanel content = new JPanel(new CardLayout()); 

    Gui(){ 
     //put menu on left, content in middle 
     add(menu, BorderLayout.WEST); 
     add(content, BorderLayout.CENTER); 
     menu.addListSelectionListener(this); 

     //add multiple cards 
     addCard(new SimpleLabelCard("First Item", "First Item Text")); 
     addCard(new SimpleLabelCard("Second Item", "Second Item Text")); 
     addCard(new SimpleTextAreaCard("Third Item", "Third Item Text")); 


     //set content to first item 
     ((CardLayout) content.getLayout()).show(content, "First Item"); 
    } 

    private void addCard(Card c){ 
     menuList.add(c.name); 
     content.add(c, c.name); 
    } 


    public static void main(String [] args){ 
     Gui gui = new Gui(); 
     gui.setSize(600, 500); 
     gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     gui.setVisible(true); 
    } 

    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     if(e.getValueIsAdjusting()) return; 

     //set card layout from JList menu 
     ((CardLayout) content.getLayout()).show(content, menu.getSelectedValue()); 
    } 
} 

другие классы, положить каждый в своем соответствующем файле.

//Card.java 
//this is the basic card class the extends JPanel 
//it contains the name so you can easily switch to it 
public class Card extends JPanel{ 
    public final String name; 

    public Card(String name){ 
     this.name = name; 
    } 
} 

//SimpleLabelCard.java 
//extends Card, so it is also a JPanel 
public class SimpleLabelCard extends Card{ 

    private JLabel label = new JLabel(); 

    public SimpleLabelCard(String name, String text) { 
     super(name); 
     label.setText(text); 
     add(label); 
    } 
} 

//SimpleTextAreaCard.java 
public class SimpleTextAreaCard extends Card{ 

    private JTextArea text = new JTextArea(); 

    public SimpleTextAreaCard(String name, String text) { 
     super(name); 
     this.text.setText(text); 
     setLayout(new BorderLayout()); 
     add(this.text, BorderLayout.CENTER); 
    } 
} 

сейчас, если вы хотите сделать другой тип карты, просто увеличьте класс карты. Надеюсь, это достаточно прямо. Это был для меня опыт обучения.

+0

вы можете упростить его до моего понимания :) просто посмотри мой код я буду действительно благодарен –

+0

Попробуйте запустить его первым, и если вам нужна дополнительная помощь, я вам поможем. убедитесь, что это то, что вы хотите. –

+0

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

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