Как изменить эту программу, добавив в нее JList из восьми цветов, который можно использовать для изменения цвета фона этого апплета? - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь добавить JList из восьми элементов, чтобы пользователь мог изменить цвет фона апплета здесь. Я не уверен, в какой раздел я должен включить эти дополнительные детали, или куда именно обратиться. Книга, которую я использую, устарела, и я просто хотел бы получить совет или решение о том, как изменить этот код для выполнения функции изменения фона.

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

public class Ch12_PrExercise1 extends JApplet {

    int number;

    @Override
    public void init() {
        String input;

        input = JOptionPane.showInputDialog("Enter a digit");

        number = Integer.parseInt(input);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);

        switch (number) {
            case 0:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 175);
                g.fillRect(50, 200, 125, 25);
                g.fillRect(150, 25, 25, 175);
                break;

            case 1:
                g.fillRect(75, 25, 75, 25);
                g.fillRect(100, 50, 50, 125);
                g.fillRect(50, 175, 150, 25);
                break;

            case 2:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(150, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(50, 125, 25, 50);
                break;

            case 3:
                g.fillRect(150, 50, 25, 175);
                g.fillRect(50, 50, 100, 25);
                g.fillRect(50, 125, 100, 25);
                g.fillRect(50, 200, 100, 25);
                break;

            case 4:
                g.fillRect(50, 25, 25, 75);
                g.fillRect(50, 100, 100, 25);
                g.fillRect(150, 25, 25, 175);
                break;

            case 5:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                break;

            case 6:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                g.fillRect(50, 125, 25, 50);
                break;

            case 7:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(150, 50, 25, 150);
                break;

            case 8:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                g.fillRect(50, 125, 25, 50);
                g.fillRect(150, 50, 25, 50);
                break;

            case 9:
            default:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                g.fillRect(150, 50, 25, 50);
                break;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Вот реализация с несколькими изменениями:

  1. Она рисует на панели, а не на контейнере верхнего уровня, таком как апплет, в качестве пользовательского окрашенного компонента.
  2. Это использует рамку, а не апплет для отображения панели.
  3. Он определяет NamedColor для инкапсуляции имени и цвета. Это удобно для списка, поскольку оно может содержать именованные цвета, а не использовать строки или индексы для сопоставления с цветом.
  4. Пользовательский окрашенный компонент (ColoredNumberPanel) определяет предпочтительный размер, поэтому контейнер верхнего уровня можно упаковать, чтобы соответствовать ему должным образом.

enter image description here

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

public class Ch12_PrExercise1_Panel {

    private JComponent ui = null;
    private final NamedColor[] namedColors = {
        new NamedColor("CYAN", Color.CYAN),
        new NamedColor("PINK", Color.PINK),
        new NamedColor("GREEN", Color.GREEN),
        new NamedColor("MAGENTA", Color.MAGENTA),
        new NamedColor("ORANGE", Color.ORANGE),
        new NamedColor("RED", Color.RED),
        new NamedColor("WHITE", Color.WHITE),
        new NamedColor("YELLOW", Color.YELLOW)
    };

    Ch12_PrExercise1_Panel() {
        initUI();
    }

    public final void initUI() {
        if (ui != null) {
            return;
        }
        SpinnerNumberModel numberModel = new SpinnerNumberModel(0, 0, 9, 1);
        JSpinner spinner = new JSpinner(numberModel);
        JOptionPane.showMessageDialog(null, spinner, "Which Number?", JOptionPane.QUESTION_MESSAGE);

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        DefaultListModel listModel = new DefaultListModel();
        for (NamedColor namedColor : namedColors) {
            listModel.addElement(namedColor);
        }
        final JList list = new JList(listModel);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setVisibleRowCount(8);
        ui.add(new JScrollPane(list), BorderLayout.LINE_START);

        final ColoredNumberPanel coloredNumberPanel = 
                new ColoredNumberPanel(numberModel.getNumber().intValue());
        ui.add(coloredNumberPanel);

        ListSelectionListener listSelectionListener = new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    NamedColor namedColor = (NamedColor)list.getSelectedValue();
                    Color color = namedColor.color;
                    coloredNumberPanel.setBackground(color);
                }
            }
        };
        list.addListSelectionListener(listSelectionListener);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception useDefault) {
            }
            Ch12_PrExercise1_Panel o = new Ch12_PrExercise1_Panel();

            JFrame f = new JFrame(o.getClass().getSimpleName());
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);

            f.setContentPane(o.getUI());
            f.pack();
            f.setMinimumSize(f.getSize());

            f.setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}

class ColoredNumberPanel extends JPanel {

    int number;
    Dimension preferredSize = new Dimension(200, 250);

    ColoredNumberPanel(int number) {
        this.number = number;
    }

    /**
     * Note: The correct method to do custom painting in a JComponent (like
     * JPanel) is paintComponent(..) rather than paint(..) as used for an
     * applet/frame/window..
     */
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g); // this also needs to be changed

        switch (number) {
            case 0:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 175);
                g.fillRect(50, 200, 125, 25);
                g.fillRect(150, 25, 25, 175);
                break;

            case 1:
                g.fillRect(75, 25, 75, 25);
                g.fillRect(100, 50, 50, 125);
                g.fillRect(50, 175, 150, 25);
                break;

            case 2:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(150, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(50, 125, 25, 50);
                break;

            case 3:
                g.fillRect(150, 50, 25, 175);
                g.fillRect(50, 50, 100, 25);
                g.fillRect(50, 125, 100, 25);
                g.fillRect(50, 200, 100, 25);
                break;

            case 4:
                g.fillRect(50, 25, 25, 75);
                g.fillRect(50, 100, 100, 25);
                g.fillRect(150, 25, 25, 175);
                break;

            case 5:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                break;

            case 6:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                g.fillRect(50, 125, 25, 50);
                break;

            case 7:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(150, 50, 25, 150);
                break;

            case 8:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                g.fillRect(50, 125, 25, 50);
                g.fillRect(150, 50, 25, 50);
                break;

            case 9:
            default:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                g.fillRect(150, 50, 25, 50);
                break;
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return preferredSize;
    }
}

class NamedColor {

    String name;
    Color color;

    public NamedColor(String name, Color color) {
        this.name = name;
        this.color = color;
    }

    @Override 
    public String toString() {
        return name;
    }
}

Общие советы

  1. Зачем кодировать апплет? Если это связано с тем, что учитель указал это, пожалуйста, обратитесь к ним Почему учителя CS должны прекратить обучение Java апплеты .
  2. Апплеты стали полностью неработоспособными для сайтов, обращающихся ко всем желающим на inte rnet. Safari и FF по умолчанию блокируют апплеты, а Chrome и IE настроены на полное удаление их поддержки. Лучше перейти от апплетов к чистому JS / HTML раньше, чем позже.
  3. Используйте логическую и последовательную форму отступа строк и блоков кода. Отступы предназначены для облегчения отслеживания потока кода! Большинство IDE имеют сочетания клавиш специально для форматирования кода.
0 голосов
/ 13 апреля 2020

Вот пример того, как вы должны делать графику. Это гораздо больше, чем это. Я также предоставляю:

  • A JList цветов, чтобы вы могли видеть один из способов сделать это.
  • Панель ввода с JLabel и JFormattedTextField для принятия ввода вместо JOptionPane, так как он легче позиционируется и позволяет управлять форматом.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
import javax.swing.text.MaskFormatter;

public class Ch12_PrExercise1 extends JPanel {
    int number;

    JFormattedTextField textField = null;
    JFrame frame = new JFrame("Ch12 PrExercise1");

    // add more if you want.
    MyColor[] colors = { new MyColor(Color.red, "Red"),
            new MyColor(Color.blue, "Blue"),
            new MyColor(Color.green, "Green"),
            new MyColor(Color.orange, "Orange"),
            new MyColor(Color.magenta, "Magenta"),
            new MyColor(new Color(155, 0, 155), "Purple"),
            new MyColor(Color.yellow, "Yellow"),
            new MyColor(new Color(128, 128, 128), "Gray") };

    Color color = Color.red;

    class MyColor {
        Color color;
        String name;

        public MyColor(Color color, String name) {
            this.color = color;
            this.name = name;
        }

        public String toString() {
            return name;
        }
    }

    public Ch12_PrExercise1() {
        setPreferredSize(new Dimension(250, 300));
        frame.add(this);
        // create JList here
        JList<MyColor> colorList = new JList<>(colors);
        colorList.setBorder(new LineBorder(Color.black, 1));
        try {
            textField =
                    new JFormattedTextField(new MaskFormatter("#"));
        } catch (Exception e) {
        }
        textField.setColumns(3);
        setLayout(new BorderLayout());
        add(colorList, BorderLayout.EAST);
        JPanel inputPanel = new JPanel();
        inputPanel.add(new JLabel("Please enter a digit: "));
        inputPanel.add(textField);
        add(inputPanel, BorderLayout.SOUTH);

        textField.addActionListener((ae) -> {
            String text = textField.getText();
            number = Integer.parseInt(text);
            textField.setText("");
            repaint();
        });

        // gets the selected color in the JList, sets color to that
        // color and issues a repaint.
        colorList.addListSelectionListener((lde) -> {
            color = ((JList<MyColor>) lde.getSource())
                    .getSelectedValue().color;
            repaint();
        });

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities
                .invokeLater(() -> new Ch12_PrExercise1().start());
    }

    public void start() {
        String input;

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // from the list of colors.
        g.setColor(color);
        switch (number) {
            case 0:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 175);
                g.fillRect(50, 200, 125, 25);
                g.fillRect(150, 25, 25, 175);
                break;

            case 1:
                g.fillRect(75, 25, 75, 25);
                g.fillRect(100, 50, 50, 125);
                g.fillRect(50, 175, 150, 25);
                break;

            case 2:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(150, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(50, 125, 25, 50);
                break;

            case 3:
                g.fillRect(150, 50, 25, 175);
                g.fillRect(50, 50, 100, 25);
                g.fillRect(50, 125, 100, 25);
                g.fillRect(50, 200, 100, 25);
                break;

            case 4:
                g.fillRect(50, 25, 25, 75);
                g.fillRect(50, 100, 100, 25);
                g.fillRect(150, 25, 25, 175);
                break;

            case 5:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                break;

            case 6:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                g.fillRect(50, 125, 25, 50);
                break;

            case 7:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(150, 50, 25, 150);
                break;

            case 8:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                g.fillRect(50, 125, 25, 50);
                g.fillRect(150, 50, 25, 50);
                break;

            case 9:
            default:
                g.fillRect(50, 25, 125, 25);
                g.fillRect(50, 50, 25, 50);
                g.fillRect(50, 100, 125, 25);
                g.fillRect(50, 175, 125, 25);
                g.fillRect(150, 125, 25, 50);
                g.fillRect(150, 50, 25, 50);
                break;
        }
    }
}
...