2014-02-04 4 views
0

Я хочу изменить размер JPanel во время работы программы, например, с помощью пункта меню. Как я могу связаться с ним? Или как мне изменить мою программу, чтобы получить доступ к live JPanel в панели контента?Java: Как я могу изменить размер JPanel во время выполнения?

Редактировать: Если я по умолчанию создаю контентную панель для игрового поля размером 400x400. Но что, если я хочу объявить опцию в меню, чтобы изменить размер до 500x500, но не потеряв весь контент, уже продвигаемый игроком.

JFrame класс:

package me.test; 

import javax.swing.JFrame; 


public class Main extends JFrame { 
    private static final long serialVersionUID = 1L; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    new Main(); 
} 

public Main() { 

    setContentPane(new MyJPanel()); 

    pack(); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setLocation(100,50); 
    setResizable(false); 
    setVisible(true); 


    } 

} 

Мои модифицированные JPanel:

package me.test; 

import java.awt.Dimension; 

import javax.swing.JPanel; 

public class MyJPanel extends JPanel { 

    public MyJPanel() { 
     setPreferredSize(new Dimension(400,400)); 
    } 
} 
+0

Изменение предпочтительный размер панели не поможет до тех пор, как она используется в качестве панели содержимого. – Marco13

+1

* «Я хочу изменить размер JPanel во время работы программы» * Перетащите 'JFrame' больше. Зачем вам делать это программно? –

ответ

0

Игра вокруг ....

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 


public class PanelResize extends JFrame 
{ 
    private static final long serialVersionUID = 1L; 

    public static void main(String[] args) { 
     new PanelResize(); 
    } 

    private JPanel panel; 

    public PanelResize() { 

     panel = new MyJPanel(); 
     getContentPane().add(panel); 

     JMenuBar menuBar = new JMenuBar(); 
     JMenu menu = new JMenu("Resize"); 
     JMenuItem menuItem = new JMenuItem("Resize"); 
     menuItem.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       panel.setPreferredSize(new Dimension(500,500)); 
       pack(); 
      } 
     }); 
     menu.add(menuItem); 
     menuBar.add(menu); 
     this.setJMenuBar(menuBar); 

     pack(); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLocation(100,50); 
     setResizable(false); 
     setVisible(true); 
    } 

} 


class MyJPanel extends JPanel { 

    public MyJPanel() { 
     setPreferredSize(new Dimension(400,400)); 
    } 
} 
+0

* «Игра вокруг ...» * Это все забава и игры, пока кто-то не потеряет глаз. К сожалению, кто-то потерял глаз! Установка предпочтительного размера и вызов 'pack()' в контейнере верхнего уровня должны быть более чем достаточно. –

+0

Ну, вопрос был довольно неясным, и другие ответы (некоторые уже удалены) также показали это. Я сделал предположение относительно намерения, но, по общему признанию, он, вероятно, был бы лучше со ссылкой на какой-то учебник .... – Marco13

+0

Ну, конечно, девиз «мусор в -> вывоз мусора» не должен применяться к вопросам и ответы, но иногда вам просто нужно сделать некоторые догадки о намерениях по открытию вопросов - по крайней мере, предложить ему возможность указать, насколько ответ отклоняется от ожидаемого * в качестве ответа. Однако теперь, когда вопрос выяснен, я уточнил свой ответ. И никто не потерял глаз :-) – Marco13

2

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

Важные моменты кода являются:

  • Установите нужный размер на компонента.
  • Получить ссылку на контейнер верхнего уровня.
  • И наконец pack() контейнер верхнего уровня.

enter image description here

import java.awt.*; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class GameSize { 

    // the GUI as seen by the user (without frame) 
    private JPanel gui = new JPanel(new GridBagLayout()); 
    Action small = new AbstractAction("Small") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      setSize(400, 100); 
     } 
    }; 
    Action large = new AbstractAction("Large") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      setSize(600, 200); 
     } 
    }; 

    private final void setSize(int w, int h) { 
     gui.setPreferredSize(new Dimension(w, h)); 
     Container c = gui.getTopLevelAncestor(); 
     if (c instanceof JFrame) { 
      JFrame f = (JFrame) c; 
      f.pack(); 
     } 
    } 

    GameSize() { 
     JToolBar tb = new JToolBar("Size"); 
     for (Action action : getActions()) { 
      tb.add(action); 
     } 
     gui.add(tb); 

     gui.setPreferredSize(new Dimension(200, 100)); 
     gui.setBackground(Color.RED); 
    } 

    /* 
    * @return the Actions 
    */ 
    public Action[] getActions() { 
     Action[] actions = {small, large}; 

     return actions; 
    } 

    /** 
    * @return the gui 
    */ 
    public JPanel getGui() { 
     return gui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       GameSize gs = new GameSize(); 

       JFrame f = new JFrame("Demo"); 
       f.add(gs.getGui()); 
       // Ensures JVM closes after frame(s) closed and 
       // all non-daemon threads are finished 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       // See http://stackoverflow.com/a/7143398/418556 for demo. 
       f.setLocationByPlatform(true); 

       JMenuBar menuBar = new JMenuBar(); 
       f.setJMenuBar(menuBar); 
       JMenu size = new JMenu("Size"); 
       menuBar.add(size); 
       for (Action action : gs.getActions()) { 
        size.add(action); 
       } 

       // ensures the frame is the minimum size it needs to be 
       // in order display the components within it 
       f.pack(); 
       // should be done last, to avoid flickering, moving, 
       // resizing artifacts. 
       f.setVisible(true); 
      } 
     }; 
     // Swing GUIs should be created and updated on the EDT 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

Это заставило меня искать Meta-Stackoverflow для этого вопроса: http://meta.stackexchange.com/q/88627/: Полный рефакторинг или минимальные изменения? Однако, стоит upvote, imho – Marco13

+0

@ Marco13 Wow. Вы действительно не заметили этого. 1) Это Q & A относится к третьему лицу, редактирующему вопрос *. До сих пор только ОР редактировал вопрос. 2) Речь идет о редактировании * кода * в вопросе, и, судя по [ревизиям] (http://stackoverflow.com/posts/21555968/revisions), код в вопросе не изменил ни одной йоты.- То, что вы сделали, пытаясь пристально следить за кодом в вопросе, - это просто увековечить плохие практики. Хотите, чтобы я посчитал и детализировал их? –

+1

Спасибо! Подумайте, это поможет, посмотрим! –

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