Domanda

I am trying to create a paint component for the panel_1 JPanel, but I don't know how to do it. This is my class.

This code works, except that it does not paint the panel_1. If I try and add it to the panel without painting it, it works just fine. Also I need that panel to refresh (repaints) automatically at a given interval. Please let help me. :D

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;

public class GUI extends JFrame implements ActionListener {

    private JPanel contentPane;
    private JTextField textField;
    private JTextField textField_1;
    private JTextField textField_2;
    private JTextField textField_3;
    private JButton btnStop, btnStart;
    private JComboBox comboBox_1, comboBox;
    private Manager manager = new Manager();
    private String arrMin, arrMax, svcMin, svcMax, simTime;
    private JTextField textField_4;
    private JPanel panel_1 = new JPanel(){
        @Override
        public void paintComponent(Graphics g){

        paintComponents(g);
         panel_1.setBackground(Color.orange);
         panel_1.setVisible(true);

          System.out.println("Just testing");
        }
    };

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUI frame = new GUI();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public GUI() {
        setResizable(false);
        setForeground(Color.DARK_GRAY);
        setBackground(Color.DARK_GRAY);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 700, 500);
        contentPane = new JPanel();
        contentPane.setForeground(Color.DARK_GRAY);
        contentPane.setBackground(Color.DARK_GRAY);
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JPanel panel = new JPanel();
        panel.setBounds(12, 12, 434, 346);
        panel.setForeground(Color.LIGHT_GRAY);
        contentPane.add(panel);
        panel.setLayout(null);

        JLabel lblArrivingTime = new JLabel("Arriving time");
        lblArrivingTime.setBounds(12, 367, 94, 15);
        lblArrivingTime.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblArrivingTime);

        JLabel lblMin = new JLabel("Min");
        lblMin.setBounds(12, 395, 70, 15);
        lblMin.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblMin);

        JLabel lblMax = new JLabel("Max");
        lblMax.setBounds(12, 418, 70, 15);
        lblMax.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblMax);

        textField = new JTextField();
        textField.setBounds(58, 394, 48, 16);
        contentPane.add(textField);
        textField.setColumns(10);

        textField_1 = new JTextField();
        textField_1.setBounds(58, 422, 48, 15);
        contentPane.add(textField_1);
        textField_1.setColumns(10);

        JLabel lblServiceTime = new JLabel("Service Time");
        lblServiceTime.setBounds(152, 367, 105, 15);
        lblServiceTime.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblServiceTime);

        JLabel lblMin_1 = new JLabel("Min");
        lblMin_1.setBounds(152, 395, 51, 15);
        lblMin_1.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblMin_1);

        JLabel lblMax_1 = new JLabel("Max");
        lblMax_1.setBounds(152, 418, 70, 15);
        lblMax_1.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblMax_1);

        textField_2 = new JTextField();
        textField_2.setBounds(209, 393, 48, 17);
        contentPane.add(textField_2);
        textField_2.setColumns(10);

        textField_3 = new JTextField();
        textField_3.setBounds(209, 417, 48, 17);
        contentPane.add(textField_3);
        textField_3.setColumns(10);

        JLabel lblSimSetup = new JLabel("Sim. Setup");
        lblSimSetup.setBounds(292, 367, 94, 15);
        lblSimSetup.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblSimSetup);

        JLabel lblQueue = new JLabel("Queue");
        lblQueue.setBounds(292, 395, 70, 15);
        lblQueue.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblQueue);

        String[] numbers = { "1", "2", "3", "4" };
        comboBox = new JComboBox(numbers);
        comboBox.setBounds(345, 395, 75, 15);
        contentPane.add(comboBox);

        JLabel lblMode = new JLabel("Mode");
        lblMode.setBounds(292, 418, 70, 15);
        lblMode.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblMode);

        String[] mode = { "Time", "Number" };
        comboBox_1 = new JComboBox(mode);
        comboBox_1.setBounds(345, 413, 75, 15);
        contentPane.add(comboBox_1);

        JLabel lblActions = new JLabel("Actions");
        lblActions.setBounds(484, 367, 70, 15);
        lblActions.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblActions);

        btnStart = new JButton("Start");
        btnStart.setBounds(482, 392, 81, 20);
        contentPane.add(btnStart);

        btnStop = new JButton("Stop");
        btnStop.setBounds(482, 415, 81, 20);
        contentPane.add(btnStop);

        JLabel lblTime = new JLabel("Time");
        lblTime.setBounds(292, 440, 70, 15);
        lblTime.setForeground(Color.LIGHT_GRAY);
        contentPane.add(lblTime);

        textField_4 = new JTextField();
        textField_4.setBounds(345, 438, 75, 17);
        contentPane.add(textField_4);
        textField_4.setColumns(10);



        panel_1.setBounds(484, 12, 202, 346);
        contentPane.add(panel_1);
        panel_1.setLayout(null);

        JTextArea textArea = new JTextArea();
        textArea.setBounds(158, 12, -126, 322);
        panel_1.add(textArea);

        btnStop.addActionListener(this);
        btnStart.addActionListener(this);
        comboBox.addActionListener(this);
        comboBox_1.addActionListener(this);


    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnStop) {
            this.dispose();
            System.exit(NORMAL);
        } else if (e.getSource() == btnStart) {
            String nrQueues = (String) comboBox.getSelectedItem();
            arrMin = textField.getText();
            arrMax = textField_1.getText();
            svcMin = textField_2.getText();
            svcMax = textField_3.getText();
            simTime = textField_4.getText();
            int aMin = 0;
            int aMax = 0;
            int sMin = 0;
            int sMax = 0;
            int sTime = 0;
            int nQueues = 1;
            try {
                nQueues = Integer.parseInt(nrQueues);
                aMin = Integer.parseInt(arrMin);
                aMax = Integer.parseInt(arrMax);
                sMin = Integer.parseInt(svcMin);
                sMax = Integer.parseInt(svcMax);
                sTime = Integer.parseInt(simTime);
            } catch (NumberFormatException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            String s = (String) comboBox_1.getSelectedItem();
            System.out.println("Selected: " + s);
            boolean mode = true;
            if (s.equals("Time")) {
                mode = true;
            } else {
                mode = false;
            }
            manager.startSimulation(aMin * 1000, aMax * 1000, sMin * 1000,
                    sMax * 1000, sTime * 1000, nQueues, mode);

        }
    }

}

Of course the handler is not relevant in this case since I am only interested in painting that panel.

È stato utile?

Soluzione

First of all, this...

private JPanel panel_1 = new JPanel(){
    @Override
    public void paintComponent(Graphics g){
        paintComponents(g);
        panel_1.setBackground(Color.orange);
        panel_1.setVisible(true);

        System.out.println("Just testing");
    }
};

Is not what custom painting is for. You should NEVER change the state of the component, or any component for that matter, from inside any paint method.

This could trigger a new repaint request which would put you into a never ending cycle of painting...

Calling paintComponents(g); is going to produce a StackOverflowException. You should not be calling paintComponents any way (note the s at the end) but you should be calling super.paintComponent(g);

JPanel is visible by default.

As it stands, you simply don't need to do anything that you are...

Don't use null layouts. Swing was designed to work with layout managers, you will have no end of issues getting the screen to update without them, besides, pixel perfect layouts are an illusion in modern user interface design, you don't control the fonts, rendering pipelines or other aspects of the target system that might effect how large elements like text are rendered.

Take a look at Laying Out Components Within a Container for more details

Altri suggerimenti

You're calling the super.paintComponents method inside of your paintComponent override. Yikes. You are also using null layout and shouldn't be.

You are setting background color but doing nothing with it. You should instead set the background color on your JPanel object, not in its paintComponent method.

i.e., here

  panel_1.setBackground(Color.orange); // here
  // !! panel_1.setBounds(484, 12, 202, 346); // you shouldn't need this!
  contentPane.add(panel_1);

Edit
You state:

Is it enough to simply append a string to the text area, and it will be displayed on the screen automatically?

Yes, as long as you take Swing thread rules into consideration.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top