Java 用SWING实现clolored自由手线
嘿 我想在JFrame中画自由线。我在一个扩展JPanel的类中实现了它。其定义如下:Java 用SWING实现clolored自由手线,java,line,swingx,Java,Line,Swingx,嘿 我想在JFrame中画自由线。我在一个扩展JPanel的类中实现了它。其定义如下: public class Draw extends JPanel implements MouseMotionListener, MouseListener 我向类Draw添加了一个void方法,在该方法中我还生成了JFrame,并添加了Draw对象。我现在的问题是:我希望能够从菜单中选择线条的颜色: JMenu colorMenu = new JMenu(); JMenuItem greenChoice
public class Draw extends JPanel implements MouseMotionListener, MouseListener
我向类Draw添加了一个void方法,在该方法中我还生成了JFrame,并添加了Draw对象。我现在的问题是:我希望能够从菜单中选择线条的颜色:
JMenu colorMenu = new JMenu();
JMenuItem greenChoice = new JMenuItem("GREEN");
greenChoice.addActionListener(this);
colorMenu.add(greenChoice);
JMenuItem redChoice = new JMenuItem("RED");
colorMenu.add(redChoice);
JMenuBar bar = new JMenuBar();
bar.add(colorMenu);
我不知道在哪里实现这个代码!我是否应该设置两个类,一个用于绘图,一个用于JFrame及其菜单?我应该如何告诉绘图类与我的JMenu交互,例如与我从菜单中选择的颜色交互?这里是我在类Drwa中生成行的地方,默认颜色为蓝色:(
谢谢!这是一个徒手绘制的课程,我用它来演示Swing图形。根据您的意愿进行修改
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter;
public class DrawingTest implements Runnable {
private JFrame frame;
private MyDrawPanel drawPanel;
private List<Point> points;
public DrawingTest() {
points = new ArrayList<Point>();
}
@Override
public void run() {
frame = new JFrame("Bouncing Vertices");
drawPanel = new MyDrawPanel(this);
MyListener alpha = new MyListener(this);
drawPanel.addMouseMotionListener(alpha);
drawPanel.addMouseListener(alpha);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(drawPanel);
frame.setSize(800, 600);
frame.setVisible(true);
}
public JPanel getDrawingPanel() {
return drawPanel;
}
public List<Point> getPoints() {
return points;
}
public void setPoint(int x, int y) {
points.add(new Point(x, y));
}
public void resetPoints() {
points.clear();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new DrawingTest());
}
private class MyListener extends MouseInputAdapter {
private DrawingTest drawingTest;
public MyListener(DrawingTest drawingTest) {
this.drawingTest = drawingTest;
}
@Override
public void mouseDragged(MouseEvent event) {
drawingTest.setPoint(event.getX(), event.getY());
drawingTest.getDrawingPanel().repaint();
}
@Override
public void mouseReleased(MouseEvent event) {
drawingTest.resetPoints();
}
}
private class MyDrawPanel extends JPanel {
private static final long serialVersionUID = 1L;
private DrawingTest drawingTest;
public MyDrawPanel(DrawingTest drawingTest) {
this.drawingTest = drawingTest;
}
@Override
public void paintComponent(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.BLUE);
for (int i = 1; i < drawingTest.getPoints().size(); i++) {
Point p1 = drawingTest.getPoints().get(i - 1);
Point p2 = drawingTest.getPoints().get(i);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
}
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Point;
导入java.awt.event.MouseEvent;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.event.MouseInputAdapter;
公共类DrawingTest实现可运行{
私有JFrame;
私人MyDrawPanel drawPanel;
私人名单点;
公共绘图测试(){
points=新的ArrayList();
}
@凌驾
公开募捐{
frame=新JFrame(“反弹顶点”);
drawPanel=新的MyDrawPanel(此);
MyListener alpha=新的MyListener(此);
drawPanel.addMouseMotionListener(alpha);
drawPanel.addMouseListener(α);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(drawPanel);
框架设置尺寸(800600);
frame.setVisible(true);
}
公共JPanel getDrawingPanel(){
返回面板;
}
公共列表getPoints(){
返回点;
}
公共无效设定点(整数x,整数y){
点。添加(新点(x,y));
}
公共无效重置点(){
点。清除();
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(newDrawingTest());
}
私有类MyListener扩展了MouseInputAdapter{
私人绘图测试绘图测试;
公共MyListener(DrawingTest DrawingTest){
this.drawingTest=drawingTest;
}
@凌驾
公共无效鼠标标记(鼠标事件){
drawingTest.setPoint(event.getX(),event.getY());
drawingTest.getDrawingPanel().repaint();
}
@凌驾
公共无效MouseEvent事件(MouseEvent事件){
drawingTest.resetPoints();
}
}
私有类MyDrawPanel扩展了JPanel{
私有静态最终长serialVersionUID=1L;
私人绘图测试绘图测试;
公共MyDrawPanel(DrawingTest DrawingTest){
this.drawingTest=drawingTest;
}
@凌驾
公共组件(图形g){
g、 setColor(Color.WHITE);
g、 fillRect(0,0,this.getWidth(),this.getHeight());
g、 setColor(Color.BLUE);
对于(int i=1;i
这看起来和工作起来确实很不错,但代码对我来说有点复杂。我试着用我的版本,但我没有设法把它拉出来,至少画出正常的线条。你能看一下吗?
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter;
public class DrawingTest implements Runnable {
private JFrame frame;
private MyDrawPanel drawPanel;
private List<Point> points;
public DrawingTest() {
points = new ArrayList<Point>();
}
@Override
public void run() {
frame = new JFrame("Bouncing Vertices");
drawPanel = new MyDrawPanel(this);
MyListener alpha = new MyListener(this);
drawPanel.addMouseMotionListener(alpha);
drawPanel.addMouseListener(alpha);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(drawPanel);
frame.setSize(800, 600);
frame.setVisible(true);
}
public JPanel getDrawingPanel() {
return drawPanel;
}
public List<Point> getPoints() {
return points;
}
public void setPoint(int x, int y) {
points.add(new Point(x, y));
}
public void resetPoints() {
points.clear();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new DrawingTest());
}
private class MyListener extends MouseInputAdapter {
private DrawingTest drawingTest;
public MyListener(DrawingTest drawingTest) {
this.drawingTest = drawingTest;
}
@Override
public void mouseDragged(MouseEvent event) {
drawingTest.setPoint(event.getX(), event.getY());
drawingTest.getDrawingPanel().repaint();
}
@Override
public void mouseReleased(MouseEvent event) {
drawingTest.resetPoints();
}
}
private class MyDrawPanel extends JPanel {
private static final long serialVersionUID = 1L;
private DrawingTest drawingTest;
public MyDrawPanel(DrawingTest drawingTest) {
this.drawingTest = drawingTest;
}
@Override
public void paintComponent(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.BLUE);
for (int i = 1; i < drawingTest.getPoints().size(); i++) {
Point p1 = drawingTest.getPoints().get(i - 1);
Point p2 = drawingTest.getPoints().get(i);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
}
}