You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java多窗口GUI绘图:单选按钮控制跨窗口绘图实现求助

Java GUI绘图程序实现指导:单选按钮控制绘图逻辑

问题描述

我正在开发一个Java GUI程序,需求如下:通过单选按钮控制在第二个窗口绘制图形(椭圆、直线),并可设置图形的轮廓色与填充色。目前已完成单选按钮的声明及第二个窗口的创建,但不清楚如何实现单选按钮选中后在第二个窗口触发绘图的逻辑。我是Java新手,请求帮助。

现有代码

ButtonWindow.java

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class ButtonWindow extends JFrame{

        JRadioButton Oval, Line,OutlineColor1,OutlineColor2,OutlineColor3,FillColor1,FillColor2,FillColor3;
        
        ButtonWindow(){
            JFrame f1=new JFrame();
            this.setTitle("Drawing Objects");
            this.setVisible(true);
            this.setLayout(new FlowLayout());
            this.pack();
            this.setSize(500,500);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            setLayout(new GridLayout(0,1));
        
              Oval = new JRadioButton("Oval shape ");   
              Line = new JRadioButton("Line");
              OutlineColor1 = new JRadioButton("Outline Color: RED");
              OutlineColor2 = new JRadioButton("Outline Color: BLUE");
              OutlineColor3 = new JRadioButton("Outline Color: GREEN");
              FillColor1 = new JRadioButton("Filling Color: RED");
              FillColor2 = new JRadioButton("Filling Color: BLUE");
              FillColor3 = new JRadioButton("Filling Color: GREEN");
              
             ButtonGroup group1 = new ButtonGroup();
                group1.add(Oval);
                group1.add(Line);
                
                ButtonGroup group2 = new ButtonGroup();
                group2.add(OutlineColor1);
                group2.add(OutlineColor2);
                group2.add(OutlineColor3);
                
                ButtonGroup group3 = new ButtonGroup();
                group3.add(FillColor1);
                group3.add(FillColor2);
                group3.add(FillColor3);                         
                
             this.add(Oval);        
             this.add(Line);            
             this.add(OutlineColor1);           
             this.add(OutlineColor2);           
             this.add(OutlineColor3);            
             this.add(FillColor1);          
             this.add(FillColor2);          
             this.add(FillColor3);      
        }
}

ObjectWindow.java

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;

public class ObjectWindow extends JFrame implements ActionListener {
    
    ButtonWindow ButtonWindow;
    
    ObjectWindow(ButtonWindow bw){
        this.ButtonWindow =bw;
        this.setTitle("Drawing Objects");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new FlowLayout());
        
    
     this.setSize(1000, 1000);
     this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        
        
    }

}

main.java

import javax.swing.JRadioButton;
import java.awt.event.*; 
import javax.swing.JFrame;
import java.awt.*;

public class main {
    public static void main(String a[]){
        ButtonWindow window = new ButtonWindow();
        new ObjectWindow(window);
        
       
    }

}

解决方案

核心思路:给单选按钮添加事件监听,存储用户选择的状态,然后在绘图窗口的自定义面板中根据状态绘制图形,状态变化时触发重绘。

1. 修改ButtonWindow类:添加监听与状态管理

添加状态变量存储用户选择,给每个单选按钮绑定监听事件,状态变化时通知绘图窗口重绘。

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class ButtonWindow extends JFrame{
    // 存储当前选中的绘图状态
    private String selectedShape = "Oval";
    private Color outlineColor = Color.RED;
    private Color fillColor = Color.RED;
    
    JRadioButton Oval, Line,OutlineColor1,OutlineColor2,OutlineColor3,FillColor1,FillColor2,FillColor3;
    private ObjectWindow drawWindow;
        
    ButtonWindow(ObjectWindow drawWindow){
        this.drawWindow = drawWindow;
        this.setTitle("控制窗口");
        this.setLayout(new GridLayout(0,1));
        this.setSize(500,500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // 初始化单选按钮,设置默认选中项
        Oval = new JRadioButton("椭圆", true);   
        Line = new JRadioButton("直线");
        OutlineColor1 = new JRadioButton("轮廓色:红色", true);
        OutlineColor2 = new JRadioButton("轮廓色:蓝色");
        OutlineColor3 = new JRadioButton("轮廓色:绿色");
        FillColor1 = new JRadioButton("填充色:红色", true);
        FillColor2 = new JRadioButton("填充色:蓝色");
        FillColor3 = new JRadioButton("填充色:绿色");
        
        // 按钮分组
        ButtonGroup group1 = new ButtonGroup();
        group1.add(Oval);
        group1.add(Line);
        
        ButtonGroup group2 = new ButtonGroup();
        group2.add(OutlineColor1);
        group2.add(OutlineColor2);
        group2.add(OutlineColor3);
        
        ButtonGroup group3 = new ButtonGroup();
        group3.add(FillColor1);
        group3.add(FillColor2);
        group3.add(FillColor3);                         
        
        // 绑定事件监听
        addShapeListeners();
        addOutlineColorListeners();
        addFillColorListeners();
        
        // 添加组件到窗口
        this.add(Oval);        
        this.add(Line);            
        this.add(OutlineColor1);           
        this.add(OutlineColor2);           
        this.add(OutlineColor3);            
        this.add(FillColor1);          
        this.add(FillColor2);          
        this.add(FillColor3);      
        
        this.setVisible(true);
    }
    
    // 图形选择监听逻辑
    private void addShapeListeners(){
        ActionListener shapeListener = e -> {
            selectedShape = Oval.isSelected() ? "Oval" : "Line";
            drawWindow.repaint(); // 通知绘图窗口重绘
        };
        Oval.addActionListener(shapeListener);
        Line.addActionListener(shapeListener);
    }
    
    // 轮廓色选择监听逻辑
    private void addOutlineColorListeners(){
        ActionListener outlineListener = e -> {
            if(OutlineColor1.isSelected()) outlineColor = Color.RED;
            else if(OutlineColor2.isSelected()) outlineColor = Color.BLUE;
            else outlineColor = Color.GREEN;
            drawWindow.repaint();
        };
        OutlineColor1.addActionListener(outlineListener);
        OutlineColor2.addActionListener(outlineListener);
        OutlineColor3.addActionListener(outlineListener);
    }
    
    // 填充色选择监听逻辑
    private void addFillColorListeners(){
        ActionListener fillListener = e -> {
            if(FillColor1.isSelected()) fillColor = Color.RED;
            else if(FillColor2.isSelected()) fillColor = Color.BLUE;
            else fillColor = Color.GREEN;
            drawWindow.repaint();
        };
        FillColor1.addActionListener(fillListener);
        FillColor2.addActionListener(fillListener);
        FillColor3.addActionListener(fillListener);
    }
    
    // 提供状态获取方法给绘图窗口
    public String getSelectedShape(){
        return selectedShape;
    }
    
    public Color getOutlineColor(){
        return outlineColor;
    }
    
    public Color getFillColor(){
        return fillColor;
    }
}

2. 修改ObjectWindow类:添加自定义绘图面板

创建继承JPanel的自定义面板,重写paintComponent方法实现绘图逻辑,这是Swing绘图的标准做法。

import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ObjectWindow extends JFrame {
    private ButtonWindow controlWindow;
    private DrawPanel drawPanel;
    
    ObjectWindow(){
        this.setTitle("绘图窗口");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(1000, 1000);
        
        // 初始化自定义绘图面板
        drawPanel = new DrawPanel();
        this.add(drawPanel);
        
        this.setVisible(true);
    }
    
    // 设置控制窗口引用
    public void setControlWindow(ButtonWindow controlWindow){
        this.controlWindow = controlWindow;
    }
    
    // 自定义绘图面板
    private class DrawPanel extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if(controlWindow == null) return;
            
            Graphics2D g2d = (Graphics2D) g;
            // 开启抗锯齿,让图形更平滑
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            
            String shape = controlWindow.getSelectedShape();
            Color outline = controlWindow.getOutlineColor();
            Color fill = controlWindow.getFillColor();
            
            // 绘制图形
            g2d.setColor(outline);
            if("Oval".equals(shape)){
                g2d.drawOval(200, 200, 400, 300);
                g2d.setColor(fill);
                g2d.fillOval(200, 200, 400, 300);
            } else if("Line".equals(shape)){
                g2d.setStroke(new BasicStroke(5)); // 设置线宽
                g2d.drawLine(200, 350, 600, 350);
            }
        }
    }
}

3. 修改Main类:调整窗口初始化顺序

确保先创建绘图窗口,再创建控制窗口,并建立两者的引用关联:

import javax.swing.SwingUtilities;

public class Main {
    public static void main(String[] args){
        // 在Swing事件调度线程中创建GUI,保证线程安全
        SwingUtilities.invokeLater(() -> {
            ObjectWindow drawWindow = new ObjectWindow();
            ButtonWindow controlWindow = new ButtonWindow(drawWindow);
            drawWindow.setControlWindow(controlWindow);
        });
    }
}

关键说明

  • 事件监听:通过ActionListener捕获单选按钮的选择事件,更新状态后调用repaint()触发绘图窗口重绘
  • 自定义绘图:必须在JPanel的paintComponent方法中绘制图形,不能直接在JFrame上绘图
  • 状态共享:通过getter方法让绘图窗口获取控制窗口的选择状态,实现数据共享
  • 线程安全:使用SwingUtilities.invokeLater确保GUI组件在事件调度线程中创建,避免线程冲突

内容的提问来源于stack exchange,提问作者Uncognito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:45:33