springlayout gridlayout addcomponent java swing layout layout-manager cardlayout

gridlayout - java layout addcomponent



Problema del menĂº principal de Java CardLayout (2)

Tu problema es add(BGR,"Breed"); . El diseño de MainMenuComp es un GridBagLayout , por lo que la restricción debe ser un GridBagConstraint , no una String (tiene "Breed" como restricción).

Ok, estoy trabajando en este juego en java llamado 8 bits quimera. Estoy trabajando en el menú principal en este momento, pero cuando estoy usando el diseño de la tarjeta, la ventana no se abrirá por alguna razón. Aquí hay un código.

import javax.swing.*; import java.awt.*; public class MainScreen extends JFrame{ String Title = "MainMenu"; MainMenuComp MMC = new MainMenuComp(); BreedingGround BGR = new BreedingGround(); public MainScreen() { setTitle("8-bit Chimera "+Title); setSize(800,600); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); add(MMC); add(BGR); } public static void main(String[] args){ new MainScreen(); } }

esa era la ventana principal

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MainMenuComp extends JPanel implements ActionListener{ BreedingGround BGR = new BreedingGround(); ImageData ID = new ImageData(); Image TitleBg; Image Title; CardLayout CL; JButton Play; public MainMenuComp() { setLayout(new GridBagLayout()); GridBagConstraints GBC = new GridBagConstraints(); ImageIcon TitleData = new ImageIcon(ID.TitleSource); ImageIcon TitleBackGroundData = new ImageIcon(ID.TitleBackGroundSource); ImageIcon PlayData = new ImageIcon(ID.PlaySource); TitleBg = TitleBackGroundData.getImage(); Title = TitleData.getImage(); Play = new JButton(); Play.setIcon(PlayData); add(Play,GBC); add(BGR,"Breed"); } public void actionPerformed(ActionEvent AE){ if(AE.getSource() == Play){ CL.show(this, "Breed"); } } public void paintComponent(Graphics g){ g.drawImage(TitleBg,0,0,800,600,this); g.drawImage(Title,250,80,280,140,this); } }

este era el diseño de la tarjeta

import javax.swing.*; import java.awt.*; public class BreedingGround extends JPanel{ ImageData ID = new ImageData(); Image Swamp; CardLayout CL; public BreedingGround(){ setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); ImageIcon SwampData = new ImageIcon(ID.SwampSource); Swamp = SwampData.getImage(); } public void paintComponent(Graphics g){ g.drawImage(Swamp,0,0,800,600,this); } }

y eso era lo que quería que se abriera CardLayout. El problema es que cuando intento ejecutarlo, la ventana no se ejecuta y esto sigue apareciendo en el compilador.

-------------------- Configuración: 8 bits Chimera - JDK versión 1.6.0_26 - ----------------- ---

Exception in thread "main" java.lang.IllegalArgumentException: cannot add to layout: constraints must be a GridBagConstraint at java.awt.GridBagLayout.addLayoutComponent(GridBagLayout.java:685) at java.awt.Container.addImpl(Container.java:1074) at java.awt.Container.add(Container.java:927) at MainMenuComp.<init>(MainMenuComp.java:26) at MainScreen.<init>(MainScreen.java:7) at MainScreen.main(MainScreen.java:23)

Proceso completado.

Todo lo que realmente quiero saber es lo que está diciendo.


No veo dónde haya configurado el diseño de un contenedor para que sea CardLayout, y si no establece el diseño como tal, no puede usarlo mágicamente. Si aún no has seguido el tutorial de CardLayout , considera hacerlo ya que todo está explicado allí.

Editar 1
Comentario de Alexander Kim:

cuando agregué el cardbagLayout no cargará la imagen y el tamaño del botón llenó toda la pantalla. También quité las rejillas

Necesita anidar sus JPanels para anidar diseños. Use un solo JPanel como el contenedor CardLayout cuya única función es mostrar otros JPanels (las "tarjetas"). Estos otros JPanels usarán los diseños que sean necesarios para mostrar correctamente los componentes que tienen, como su JButton o "grids" (sean lo que sean). E incluso estos JPanels pueden contener otros JPanels que usan otros diseños.

De nuevo, lea los tutoriales de diseño, ya que está todo bien descrito allí. No te arrepentirás de hacer esto.

Editar 2
Aquí hay un ejemplo muy simple que usa un CardLayout. El componente mostrado por CardLayout utilizando JPanel (llamado cardContainer) cambia según el elemento seleccionado en un cuadro combinado.

Aquí está el CardLayout y el JPanel que lo usa:

private CardLayout cardLayout = new CardLayout ();

// *** JPanel to hold the "cards" and to use the CardLayout: private JPanel cardContainer = new JPanel(cardLayout);

Y así es como agrego un componente al JPanel que usa cardlayout:

JPanel redPanel = new JPanel(); //... String red = "Red Panel"; cardContainer.add(redPanel, red); // add the JPanel to the container with the String

También agrego el String a un JComboBox para poder usar este cuadro combinado más tarde para decirle al CardLayout que muestre este JPanel (redPanel) si el usuario selecciona el elemento "Rojo" en este mismo JComboBox:

cardCombo.addItem(red); // also add the String to the JComboBox

Aquí está el ActionListener en el JComboBox que me permite cambiar el elemento que se muestra en la tarjeta usando JPanel:

cardCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String item = cardCombo.getSelectedItem().toString(); // *** if combo box changes it tells the CardLayout to // *** swap views based on the item selected in the combo box: cardLayout.show(cardContainer, item); } });

Y aquí está todo el shebang:

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SimpleCardLayoutDemo { private CardLayout cardLayout = new CardLayout(); // *** JPanel to hold the "cards" and to use the CardLayout: private JPanel cardContainer = new JPanel(cardLayout); private JComboBox cardCombo = new JComboBox(); private JPanel comboPanel = new JPanel();; public SimpleCardLayoutDemo() { JPanel greenPanel = new JPanel(new BorderLayout()); greenPanel.setBackground(Color.green); greenPanel.add(new JScrollPane(new JTextArea(10, 25)), BorderLayout.CENTER); greenPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); greenPanel.add(new JButton("Bottom Button"), BorderLayout.PAGE_END); String green = "Green Panel"; cardContainer.add(greenPanel, green); cardCombo.addItem(green); JPanel redPanel = new JPanel(); redPanel.setBackground(Color.red); redPanel.add(new JButton("Foo")); redPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); String red = "Red Panel"; cardContainer.add(redPanel, red); cardCombo.addItem(red); JPanel bluePanel = new JPanel(); bluePanel.setBackground(Color.blue); JLabel label = new JLabel("Blue Panel", SwingConstants.CENTER); label.setForeground(Color.white); label.setFont(label.getFont().deriveFont(Font.BOLD, 32f)); bluePanel.add(label); String blue = "Blue Panel"; cardContainer.add(bluePanel, blue); cardCombo.addItem(blue); comboPanel.add(cardCombo); cardCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String item = cardCombo.getSelectedItem().toString(); // *** if combo box changes it tells the CardLayout to // *** swap views based on the item selected in the combo box: cardLayout.show(cardContainer, item); } }); } public JPanel getCardContainerPanel() { return cardContainer; } public Component getComboPanel() { return comboPanel ; } private static void createAndShowUI() { SimpleCardLayoutDemo simplecardDemo = new SimpleCardLayoutDemo(); JFrame frame = new JFrame("Simple CardLayout Demo"); frame.getContentPane().add(simplecardDemo.getCardContainerPanel(), BorderLayout.CENTER); frame.getContentPane().add(simplecardDemo.getComboPanel(), BorderLayout.PAGE_END); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } // to run Swing in a thread-safe way public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } }