将绘制的(和可编辑的)矩形添加到包含滑块和文本字段的网格数组

Adding a drawn (and editable) rectangle to a grid array containing sliders and textFields

免责声明:此代码用于作业。当然,我问的问题与作业的要求没有任何关系(它没有指定需要任何类型的布局),但我想提一下。

我的任务是创建一个 GUI,显示一个矩形,其颜色可以通过三个滑块 (RGB) 以及显示每个滑块当前值 (0-255) 的三个文本字段进行更改。我已经设法找到一种方法来通过数组在我想要的位置设置滑块和文本字段,但我不知道如何将矩形添加到该数组的插槽中(或者如果我可以的话)。我目前的代码还将矩形绘制为两条相交线而不是实心块。这和我的布局有关系吗?

package ExercisePackage;


import java.awt.Graphics;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

import javax.swing.JFrame;

public class MyColorChooser extends JPanel {

    // Holds int values
    private int red = 255;
    private int green = 255;
    private int blue = 255;
    // Holds color sliders
    private JSlider redSlider;
    private JSlider greenSlider;
    private JSlider blueSlider;
    // Holds slider text numbers
    private JTextField redText;
    private JTextField greenText;
    private JTextField blueText;

    // Create rectangle
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(new Color(red, green, blue));
        g.fillRect(15, 25, 100, 20);
    }

    public MyColorChooser()
    {
        // Create and set layout array for specific cell placement
        int rows = 3;
        int columns = 3;
        JPanel[][] panelHolder = new JPanel[rows][columns];
        setLayout(new GridLayout(rows, columns, 5, 5));
        // Formula for cell placement
        for(int m = 0; m < rows; m++) {
            for(int n = 0; n < columns; n++) {
                panelHolder[m][n] = new JPanel();
                add(panelHolder[m][n]);
            }
        }

        // Create sliders
        redSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 0);
        redSlider.addChangeListener(new SliderListener());
        greenSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 0);
        greenSlider.addChangeListener(new SliderListener());
        blueSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 0);
        blueSlider.addChangeListener(new SliderListener());

        // Create text fields
        redText = new JTextField("0", 3);
        redText.setEditable(false);
        greenText = new JTextField("0", 3);
        greenText.setEditable(false);
        blueText = new JTextField("0", 3);
        blueText.setEditable(false);

        // Add sliders and text fields
        panelHolder[0][0].add(redSlider);
        panelHolder[0][1].add(greenSlider);
        panelHolder[0][2].add(blueSlider);
        panelHolder[1][0].add(redText);
        panelHolder[1][1].add(greenText);
        panelHolder[1][2].add(blueText);   
    }

    // Inner class to handle event changes when the slider is moved
    private class SliderListener implements ChangeListener {

        public void stateChanged(ChangeEvent e)
        {
            // Link color values to slider
            red = redSlider.getValue();
            green = greenSlider.getValue();
            blue = blueSlider.getValue();

            // Link text field values to slider
            redText.setText(Integer.toString(red));
            greenText.setText(Integer.toString(green));
            blueText.setText(Integer.toString(blue));

            // Link rectangle color to sliders
            repaint();
        }
    }

    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setContentPane( new MyColorChooser() );
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

不清楚为什么您有 JPanel[][] 您的问题似乎是您向 JPanel 添加了一堆组件,它还绘制了一个颜色框。所以您想制作一个新的 JPanel 来绘制颜色框,并将其添加到您的组件中。

第一个更改是将您的 paintComponent 替换为 JPanel。

JPanel colorPanel = new JPanel(){
    // Create rectangle
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(new Color(red, green, blue));
        g.fillRect(15, 25, 100, 20);
    }
    @Override
    public Dimension getPreferredSize(){
         //should be fixed.
         return new Dimension(115, 45);
    }
}

然后在构造函数中将该组件添加到您的布局中(我不喜欢在构造函数中做这么多 gui 工作。)

    //... continuing of constructor.
    panelHolder[1][0].add(redText);
    panelHolder[1][1].add(greenText);
    panelHolder[1][2].add(blueText);
    panelHolder[2][0].add(colorPanel);
}

我现在已经制作了一个绘制矩形的组件并将其添加到原始布局中。一些问题。

  • 新组件大小。
  • 绘制矩形的位置可能不是你想要的。
  • 网格布局中的位置可能不正确。