2013-12-15 1 views
0
private static final long serialVersionUID = 1L; 
String[] options = {"1","2","4","8","16","20","40","100","400"} ; 
int[] optionsNum = {1,2,4,8,16,20,40,100,400}; 
JComboBox<String> box = new JComboBox<>(options); 
JLabel prompt = new JLabel("How complex do you want the circle to be?"); 
ImageIcon image; 

Circle p = new Circle(1); 
int boxindex = 0; 

public CircleDrawer(){ 
    image = new ImageIcon(p.getImage()); 
    box.setSelectedIndex(boxindex); 
    setLayout(new FlowLayout()); 
    add(new JLabel(image)); 
    add(prompt); 
    add(box); 
    pack(); 
    setSize(851, 950); 
    setTitle("Circle Drawer"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    box.addActionListener(this); 

} 

public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == box){ 
     boxindex = box.getSelectedIndex(); 
     p.setComplexity(optionsNum[boxindex]); 
     image = new ImageIcon(p.getImage()); 
     add(new JLabel(image)); 
     validate(); 
    } 
} 

public static void main(String[] args) { 
    CircleDrawer f = new CircleDrawer(); 
    f.setVisible(true); 
} 

В принципе, у меня есть этот код. Он ссылается на класс под названием Circle, который вычисляет некоторые точки на внешнем краю круга и рисует их с помощью paintComponent. В этом классе есть метод, называемый getImage, который использует метод paintComponent и помещает его в BufferedImage.Как сделать этот ActionListener полностью re-draw JFrame?

public BufferedImage getImage() { 

    BufferedImage hello = new BufferedImage(805, 805, BufferedImage.TYPE_INT_ARGB); 
    Graphics g = hello.getGraphics(); 
    paintComponent(g); 

    return hello; 
} 

Нравится так.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ полностью перерисовать JFrame. Я пытался очистка JFrame в рамках метода actionPerformed с помощью removeAll(), а затем ПОЛНОСТЬЮ настройка кадра снова (add всех компонент, pack, setSize, setTitle и т.д.), а затем repaint, revalidate, или просто validate это.

Если я просто это add изображение, а затем validate это, я могу видеть изображение обновляется, но это просто получать пристегивается в конце JFrame (так же, как я бы ожидать, что она с помощью FlowLayout), но это не то поведение, в котором я нуждаюсь. Это просто показывает, что это своего рода работа.

Мой вопрос заключается в следующем: как мне сделать повторное рисование JFrame, когда пользователь меняет параметры внутри JComboBox?

+0

Для лучшей помощи раньше, опубликовать [SSCCE] (http://sscce.org /). –

ответ

2
Graphics g = hello.getGraphics(); 
paintComponent(g); 

Не используйте getGraphics() и никогда не вызывайте paintComponent() напрямую. Swing будет использовать соответствующие методы рисования.

add(new JLabel(image)); 
validate(); 

При добавлении (удалить) компоненты из видимого GUI общая структура кода является:

add(...); 
revalidate(); // to invoke the layout manager 
repaint(); to repaint the components 
+0

Спасибо за ввод. Что я использую, кроме getGraphics? На мой взгляд, мне не нужно добавлять/удалять компоненты, потому что я меняю переменную, что компонент находится внутри с помощью: image = new ImageIcon (p.getImage()); ', но когда я пытаюсь для 'revalidate' /' repaint', ничего не происходит. – tssguy123

+0

'Что я использую, кроме getGraphics?' - у вас есть методы setter на вашем компоненте, чтобы изменить свойство компонента. Затем внутри метода setter вы вызываете revalidate() и repaint(). 'Мне не нужно добавлять/удалять компоненты' - полностью согласен, но вы опубликовали код, показывающий, что вы добавляете компонент, поэтому я просто объяснил, как это сделать. – camickr

+0

Я уверен, что мне нужно использовать 'getGraphics'. Если есть какой-то способ сделать макеты 'paintComponent', то кто-то сказал мне, что единственный способ сделать это - рисовать «BufferedImage», и когда я искал, как это сделать, мне сказали использовать «getGraphics». Я не могу вызвать f.repaint() из метода 'actionPerformed', только' repaint() '. Я довольно смущен в этот момент. Ха-ха. – tssguy123

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