Java Как перерисовать JPanel (заново создать объект)? - PullRequest
1 голос
/ 08 ноября 2011

У меня проблема в том, что мне нужно перерисовывать / перестраивать область рисования только при нажатии клавиши «c». То, как я использую repaint (), приводит к тому, что область рисования занимает положение. Я также замечаю, что всякий раз, когда я изменяю размер кадра, кейлист перестает работать.

Проблемы:

  1. невозможно правильно перекрасить.
  2. Keylistener не работает после изменения размера кадра.

Люблю прикрепить дисплей, но кажется, что он заблокирован, потому что я новичок.

Следующий код является основной функцией, которая вызывает класс "newZone".

    frame.addComponentListener(new ComponentAdapter() { 

        public void componentResized(ComponentEvent e){
            System.out.println("component Rebuild"); 
            frame.getContentPane().removeAll();
            frame.getContentPane().invalidate();
            JComponent newContentPane = new newZone(frame.getSize());
            newContentPane.setOpaque(true);
            frame.getContentPane().add(newContentPane);
            frame.getContentPane().revalidate();
            frame.setContentPane(newContentPane); 
        }
    });

Ниже приведен класс newZone, который содержит Paint & keylistener:

public class newZone extends JComponent implements MouseListener, MouseMotionListener, KeyListener {

JPanel panel1;
JTextArea textArea;
JScrollPane scrollPane;
MyDrawingTool Drawing;
static int firsttimer = 0;
static int preposX = 0;
static int preposY = 0;
static int widthPercentage = 80 , heightPercentage = 93;
static int numberOfYboxes,numberOfXboxes;
static Dimension currentPanelSize;
static final String NEWLINE = System.getProperty("line.separator");
static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();


public newZone(Dimension currentPanelSize1) {

    currentPanelSize = currentPanelSize1; 

    Drawing = new MyDrawingTool();
    Drawing.setBackground(Color.WHITE);
    Drawing.setBounds(  10, 10, 
                        (int) currentPanelSize.getWidth()*(widthPercentage)/100, 
                        (int) currentPanelSize.getHeight()*(heightPercentage)/100 );
    Drawing.setPreferredSize(new Dimension( (int) currentPanelSize.getWidth()*(widthPercentage)/100,
                                            (int) currentPanelSize.getHeight()*(heightPercentage)/100));

    Drawing.addMouseListener(this);
    Drawing.addMouseMotionListener(this);

    add(Drawing);

    addKeyListener(new KeyAdapter() 
    {
         public void keyPressed(KeyEvent e){ 
             System.out.println( "Key type: "+e.getKeyChar()); 

             if(e.getKeyChar() == 'c'){
                 Drawing.redraw();
             }
         }
    });
    setFocusable(true);
}


class MyDrawingTool extends JPanel{

    void redraw(){

        repaint();
    }

    @Override
    public void paint(Graphics q){

        //super.paint(q);

        int j,k, width, height;
        int startX = 10, startY = 10;
        int boxSize = 50;

        width  = (int)currentPanelSize.getWidth()*(widthPercentage)/100;
        height = (int)currentPanelSize.getHeight()*(heightPercentage)/100;

        numberOfYboxes = (height-20)/50;
        numberOfXboxes = (width-20)/50;

        for ( j = 0; j < numberOfYboxes; j++)
        {   
            startX  = 10;
            for ( k = 0; k < numberOfXboxes; k++)
            {   
                q.setColor(Color.WHITE);
                q.fillRect(startX, startY, boxSize, boxSize);
                q.setColor(Color.BLUE); //Set line color
                q.drawRect(startX, startY, boxSize, boxSize);
                startX+=boxSize;
            }
            startY+=boxSize;

        } 
    }
} 

}

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

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

Все, что вам нужно сделать, это добавить панель в ЦЕНТР панели содержимого фрейма.Панель будет автоматически увеличиваться / уменьшаться в размере при изменении размера рамки.В ComponentListener нет необходимости.

В методе paintComponent () необходимо выполнить нестандартное рисование, и при запуске не забудьте вызвать super.paintComponent (...).

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

0 голосов
/ 09 ноября 2011

Кажется, вам вообще не нужно переключать панель содержимого.Если вы используете какой-то макет на панели содержимого по умолчанию, как подсказывает @camickr, вам не нужно обрабатывать изменение размера и другие вещи вручную.Удачи там.

...