別のJavaのスイングの質問。私は本当に本当にたくさんの時間を探しましたが、私のコードは動作しません。だから皆さんが私を助けてくれることを願っています。私は基本的な理解の問題があると思う。Javaで形を描く字形
既存のコードを展開する必要があります。 私の最初の仕事は、マウスクリックから線を引いてリリースすることでした。私はそれをうまく実装しました。
ここで、JMenuItemをクリックして円を描画するために、RandomDrawerクラスに不足しているコードを実装する必要があります。彼らは無作為でなければなりませんが、それは今は重要ではありません。実際に私の形を見ると、私はこれを行うことができます:D。
私の問題は、何かを描くことができないということです。 私は彼にキャンバスにペイントするように教えてもらえますか? Painterクラスでは、RandomDrawerクラスと同じ方法で実装していますが、それはできません。 誰かが私を助けることができますか?ここで
は、これまでの私のコードです:
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());
}
}
}
どうもありがとうございました。
私にとって大きな助けとなるのは、各メソッド(およびそれらのメソッドの中に*たくさんのプリントを*追加することによってコードが何をしているのかを追跡することです。各アトミックコールの前または後)。その後、コードの実行を追跡し、何が間違っているのかを見つけることができます。 – klaar