Hallo ihr Java-Enthusiasten,
ich habe gerade ein wahrscheinlich typisches Anfängerproblem. Ich habe ein JFrame mit einem JPanel und einem Menü mit zwei Menüeinträgen. Bei Klick auf den ersten Eintrag sollen im JPanel Zufallslinien gezeichnet werden, beim zweiten Menüeintrag dasselbe für Zufallsrechtecke. Das funktioniert auch bis auf die Tatsache dass die Rechtecke bzw. Linien erst sichtbar werden, wenn der ganze Zeichenvorgang abgeschlossen ist. Ich habe zwischen jedem Zeichnen eine Zeitverzögerung eingebaut, da man den Zeichenvorgang beobachten können soll. Ein analoges AWT-Programm funktioniert, dei Swing Version jedoch nicht. Die Lösung ist wahrscheinlich so simpel dass es mir peinlich sein sollte. Hier mal die beiden Quellcodes. Entscheidend ist die zweite (PaintPanel). Zuerst das Hauptprogramm:
Und nun noch der zweite Teil:
Ich sehe vermutlich hier gerade den Wald vor lauter Bäumen nicht.
Vielen Dank schon mal für eure Hilfe!
ich habe gerade ein wahrscheinlich typisches Anfängerproblem. Ich habe ein JFrame mit einem JPanel und einem Menü mit zwei Menüeinträgen. Bei Klick auf den ersten Eintrag sollen im JPanel Zufallslinien gezeichnet werden, beim zweiten Menüeintrag dasselbe für Zufallsrechtecke. Das funktioniert auch bis auf die Tatsache dass die Rechtecke bzw. Linien erst sichtbar werden, wenn der ganze Zeichenvorgang abgeschlossen ist. Ich habe zwischen jedem Zeichnen eine Zeitverzögerung eingebaut, da man den Zeichenvorgang beobachten können soll. Ein analoges AWT-Programm funktioniert, dei Swing Version jedoch nicht. Die Lösung ist wahrscheinlich so simpel dass es mir peinlich sein sollte. Hier mal die beiden Quellcodes. Entscheidend ist die zweite (PaintPanel). Zuerst das Hauptprogramm:
Java:
package paintpackage;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class PaintWindow extends JFrame {
private JPanel contentPane;
PaintPanel myPanel;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PaintWindow frame = new PaintWindow();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public PaintWindow() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 801, 561);
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu mnNewMenu = new JMenu("Paint");
menuBar.add(mnNewMenu);
JMenuItem mntmNewMenuItem_1 = new JMenuItem("Rectangle");
mntmNewMenuItem_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myPanel.setMode(2);
myPanel.repaint();
}
});
mnNewMenu.add(mntmNewMenuItem_1);
JMenuItem mntmNewMenuItem = new JMenuItem("Line");
mntmNewMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myPanel.setMode(1);
myPanel.repaint();
}
});
mnNewMenu.add(mntmNewMenuItem);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
myPanel= new PaintPanel();
myPanel.setBounds(10, 11, 765, 478);
contentPane.add(myPanel);
myPanel.setLayout(null);
}
}
Und nun noch der zweite Teil:
Java:
package paintpackage;
import java.awt.Graphics;
import javax.swing.JPanel;
public class PaintPanel extends JPanel
{
int paintMode = -1;
int x1,y1,x2,y2,width,height;
public void setMode(int mode)
{
paintMode = mode;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if(paintMode == 1)
{
for(int i =1;i<1000;i++)
{
System.out.println(i);
x1 = (int)(Math.random() * 50);
y1 = (int)(Math.random() * 50);
x2 = (int)(Math.random() * 400);
y2 = (int)(Math.random() * 400);
g.drawLine(x1,y1,x2,y2);
try
{
Thread.sleep(50);
}
catch (Exception ex)
{
}
}
}
if(paintMode == 2)
{
for(int i =1;i<1000;i++)
{
System.out.println(i);
x1 = (int)(Math.random() * 50);
y1 = (int)(Math.random() * 50);
width = (int)(Math.random() * 400);
height = (int)(Math.random() * 400);
g.fillRect(x1,y1,width,height);
try
{
Thread.sleep(50);
}
catch (Exception ex)
{
}
}
}
}
}
Ich sehe vermutlich hier gerade den Wald vor lauter Bäumen nicht.
Vielen Dank schon mal für eure Hilfe!