başka bir java swing sorusu. Gerçekten çok fazla saat aradım ama kodumu çalıştıramıyordum ... bu yüzden bana yardımcı olabileceğinizi umuyorum. Sanırım bazı temel anlayış sorunlarım var.Cant çizmek Java'daki şekiller
Varolan kodu genişletmem gerekiyor. İlk görevim, mouseclick'ten serbest bırakmak için bir çizgi çizmek, bunu başarılı bir şekilde uyguladım.
Şimdi JMenuItem tıklatmasıyla daire çizmek için RandomDrawer sınıfında eksik kodu uygulamalıyım. Rastgele ve hepsi olmalılar, ama şu an önemli değil, bunu yapabilir miyim?
Sorunum, hiç bir şey çizemiyorum. Tuval üzerine resim yapmasını nasıl söyleyebilirim? Painter Sınıfında, bunu RandomDrawer Sınıfı ile aynı şekilde uyguladığımda çalıştı. Birisi bana yardım edebilir mi?
package plotterpackage;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
/
public class Main {
private JFrame frame;
private JPanel canvas;
private JPanel statusBar;
private JTextField status;
public Main() {
initialize();
}
public static void main(String[] args) {
Main app = new Main();
app.start();
}
protected void initialize() {
frame = new JFrame("Main");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setBounds(50,50, 50+640, 50+480);
frame.setBackground(Color.GREEN);
frame.setJMenuBar(createMenuBar());
frame.getContentPane().add(createContent(), BorderLayout.CENTER);
frame.getContentPane().add(createStatusBar(),BorderLayout.SOUTH);
}
public void start() {
// show the GUI
frame.setVisible(true);
status.setText("Application started");
}
protected JComponent createContent() {
canvas = new JPanel();
canvas.addMouseListener(new Painter());
canvas.setBackground(new Color(128,218,255));
canvas.setForeground(Color.RED);
canvas.setBorder(new BevelBorder(BevelBorder.LOWERED));
return canvas;
}
protected JComponent createStatusBar() {
FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
layout.setHgap(5);
statusBar = new JPanel(layout);
statusBar.add(new JLabel("Status: "));
status = new JTextField();
status.setPreferredSize(new Dimension(400,25));
status.setEditable(false);
status.setBorder(new BevelBorder(BevelBorder.RAISED,Color.MAGENTA,Color.LIGHT_GRAY));
status.getInsets().set(2, 10, 2, 10);
statusBar.add(status);
return statusBar;
}
protected JMenuBar createMenuBar() {
JMenuBar mb = new JMenuBar();
JMenuItem item;
JMenu menu;
// Action menu
menu = new JMenu("Actions");
mb.add(menu);
item = new JMenuItem("Draw RandomCircle");
item.addActionListener(new RandomDrawer());
menu.add(item);
item = new JMenuItem("Draw RandomTriangle");
item.addActionListener(new RandomDrawer());
menu.add(item);
menu.addSeparator();
item = new JMenuItem("Exit");
item.addActionListener(new AppCloser());
menu.add(item);
// Color menu not used so far
menu = new JMenu("Colors");
mb.add(menu);
// Help menu not used so far
menu = new JMenu("Help");
mb.add(menu);
return mb;
}
class AppCloser implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.printf("application finished, bye-bye... \n");
frame.setVisible(false);
frame.dispose();
System.exit(0);
}
}
class RandomDrawer extends JPanel implements ActionListener {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(50, 50, 50, 50);
//repaint();
}
@Override
public void actionPerformed(ActionEvent e) {
double x = Math.random();
double y = Math.random();
status.setText(String.format("rnd draw x:%.3f y:%.3f",x,y));
//Graphics2D gg = (Graphics2D) canvas.getGraphics();
//paintComponent(gg);
//gg.draw(new Line2D.Double(0, 0, x, y));
//gg.drawLine(5, 5, 20, 20);
//gg.paintComponent();
}
}
class Painter extends MouseAdapter {
Point start, end;
int startX, startY;
@Override
public void mousePressed(MouseEvent e) {
start = e.getPoint();
startX = e.getX();
startY = e.getY();
status.setText(String.format("Mouse start: " + start));
}
@Override
public void mouseReleased(MouseEvent e) {
end = e.getPoint();
status.setText(String.format("Mouse end: " + end));
Graphics2D gc = (Graphics2D) canvas.getGraphics();
//gc.drawLine(0, 0, 80, 80);
gc.drawLine(startX, startY, e.getX(), e.getY());
//gc.drawOval(startX, startY, e.getX(), e.getY());
//gc.fillOval(startX, startY, e.getX(), e.getY());
}
}
}
Çok teşekkürler:
İşte şimdiye kadar benim kodudur. Ayrıca, MouseMotionListener öğesini tuvalinize de eklemeniz gerekir.
Benim için büyük bir yardım kodunuzu her yönteme baskı * Bir sürü * ekleyerek yapıyor (ve bu yöntemleri içinde ne olursa olsun izlemek, her atomik çağrısından önce veya sonra). Ardından kodunuzun yürütülmesini takip edebilir ve yanlış gidenleri bulabilirsiniz. – klaar