2013-08-01 6 views
-1
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
class GraphicsFunda extends JPanel implements ActionListener 
{ 
Graphics myg; 
JButton jb; 
GraphicsFunda() 
{ 

jb = new JButton("Draw"); 
add(jb); 
setBackground(Color.YELLOW); 
jb.addActionListener(this); 
} 
public void paintComponent(Graphics g) 
{ 
myg=g; 
g.drawOval(100,300,50,50); 
} 
public void actionPerformed(ActionEvent ae) 
{ 
if(ae.getSource()==jb) 
myg.fillRect(10,10,200,200); 
} 
public static void main(String... sd) 
{ 
GraphicsFunda gf = new GraphicsFunda(); 
JFrame jf = new JFrame(); 
jf.add(gf,BorderLayout.NORTH); 
jf.setBackground(Color.blue); 
jf.setSize(400,400); 
jf.setVisible(true); 
} 

} Пожалуйста, помогите мне решить проблему. Если взять ссылку на графики класса из paintComponent, то мы можем использовать его в рисунок и другие формы, , но он не работает здесь :(получение графика ссылка будет работать?

+3

«Не работает» никогда не является достаточным описанием проблемы. –

ответ

1

Когда вы рисуете на графике вне методов paint типа, то вам имеют тенденцию иметь проблемы Все Графика должна произойти внутри метода paintComponent.Перед, даже если это сработало, изменения будут перезаписаны, когда пользователь сделает что-то вроде изменения размера экрана, когда вызывается перерисовка .

Если вы не можете реструктурировать программу только для рисования в paintComponent, одна альтернатива t o сделайте весь свой чертеж до BufferedImage, а затем просто перерисуйте изображение до Graphics на перерисовке. Конечно, это также имеет проблемы (например, более высокая стоимость для изменения размера, если изображение недостаточно велико), поэтому это не должен быть метод goto; вместо этого измените свой код, чтобы метод repaint знал, что рисовать, если это вообще возможно.

2

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

В вашем actionPerformed() введите состояние панели и позвоните по номеру repaint(). Затем в методе paintComponent() прочитайте состояние состояния панели и соответствующим образом нарисуйте. Состояние, в вашем случае, может быть, например, списком фигур для рисования.

0

Все рисунки должны выполняться в контексте вашего метода paintComponent (который уже выделен), но это ставит вопрос о том, как?

Вы должны размещать какой-либо окрашиваемый объект в файле List, который содержит информацию о том, где и как большой.

Самым простым решением было бы использовать что-то вроде классов, которые простираются от Shape, они просто могут быть сделаны или заполнены через Graphics контекст

См ...

Для получения более подробной информации

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