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

问题描述 投票:0回答:1

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

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

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);
    }
}
java swing grid-layout paintcomponent
1个回答
0
投票

目前尚不清楚为什么会有JPanel[][]的问题似乎是您向JPanel添加了一堆组件,这也绘制了一个颜色框。因此,您要制作一个新的JPanel来绘制颜色框,并将其添加到您的组件中。

第一个更改是用JPanel替换paintComponent。

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);
}

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

  • 新组件的大小。
  • 绘制矩形的位置可能不在您想要的位置。
  • 网格布局中的位置可能已关闭。
© www.soinside.com 2019 - 2024. All rights reserved.