Я создаю своеобразное приложение для рисования. Пользователь может перемещать круг в JPanel, нажимая/перетаскивая мышь.Как предотвратить обновление JPanel?
У меня есть JCheckBoxMenuItem
в одном из моих JMenu
с:
JCheckBoxMenuItem checkitem = new JCheckBoxMenuItem("Draw mode",false);
- Когда она не активирована, то круг можно перемещать только (путем перетаскивания/клавиши) и предыдущий круг будет стерта.
- Когда она включена, то круг может быть перемещен только, но предыдущий круг не будет удален при перемещении/нажатии мышей (Это работает так же, как программа для рисования)
укороченной версию моих код:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class GUI extends JFrame implements MouseListener, MouseMotionListener, ActionListener, ItemListener
{
JPanel mainPan, colorPan;
Color color = Color.BLACK;
JCheckBoxMenuItem checkitem;
boolean clear = true;
public GUI(String header)
{
maker();
mainPan.addMouseListener(this);
mainPan.addMouseMotionListener(this);
add(mainPan , BorderLayout.CENTER);
add(colorPan, BorderLayout.PAGE_END);
}
public void maker()
{
colorPan = new JPanel();
colorPan.setLayout(new GridLayout(1, 0));
mainPan = new JPanel(){
@Override
public void paintComponent(Graphics g)
{
//g.setColor(Color.WHITE);
//g.fillRect(0,0,getWidth(),getHeight());
if(clear)
super.paintComponent(g); //Do the same thing as above(Clear JPanel)
g.setColor(color);
g.fillOval(x,y,50,50); //x and y are integer variables that I use in my full program
}
};
checkitem = new JCheckBoxMenuItem("Draw mode",false);
//After adding this to a JMenu,
checkitem.addItemListener(this);
}
public void itemStateChanged(ItemEvent e)
{
if(e.getStateChange() == ItemEvent.SELECTED)
{
clear = false;
}
else
{
clear = true;
}
}
}
в приведенной ниже скриншоте показан результат моей полной программе:
colorPan
- это JPanel, полный JButtons разных цветов. Верх его mainPan
.
Прямо сейчас, режим рисования не работает должным образом. Я всегда думал, что super.paintComponent(g);
был тем, который очищает/сбрасывает экран, когда вызывается repaint()
. Но я удалил это и был очень удивлен, увидев, что программа ведет себя одинаково.
В принципе, моя проблема здесь:
if(clear)
super.paintComponent(g);
Мне нужно, чтобы предотвратить все от очищаются, когда repaint()
называется. Как я могу достичь того, чего хочу?
Полный пример цитируется [здесь] (http://stackoverflow.com/a/11944233/230513). – trashgod
Я этого не понимаю. Не могли бы вы разместить здесь ответ? –
Возможный дубликат: [Запретить Java перерисовывать содержимое JPanel при обновлении] (http://stackoverflow.com/questions/4065456/prevent-java-from-repainting-the-content-of-a-jpanel-while- обновление) – user3261344