0

我正在尝试使用 grouplayout 创建一个 JPanel,但它仍然给出相同的错误。它不附加到水平组。当我运行程序时,有时它是 okButton,然后是 openButton,下一次是单选按钮之一。即使我没有更改代码。我阅读了文档,并且我了解ParallelGroup水平组中的每个人都需要SequentialGroup垂直组中的每个人,反之亦然。

编码:

package gui;

import javax.swing.ButtonGroup;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import main.MainMenu;

import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.ScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class UserInterface 
{   
    JFrame guiFrame = new JFrame(); 
    MainMenu menu = new MainMenu();
    Task task;

    final JButton okButton = new JButton();

    public boolean done;
    public boolean isDrawed;
    public boolean okButtonIsPressed;
    public JScrollPane scrollPanel;
    public JProgressBar progressBar;
    public String text;
    public String outputPath = "C:\\Users\\Test\\";

    private JPanel mainPanel;   
    private JPanel dotPanel;       
    private ButtonGroup group;
    private String newFileName;   
    private JButton openButton;
    private JTextArea textForScrollPane;
    private JTextField textFieldFilePath;
    private JRadioButton radioButtonA;
    private JRadioButton radioButtonB;
    private JRadioButton radioButtonC;

    public void UserInterface()
    {
        task = new Task();
        dotPanel  = new JPanel();
        mainPanel  = new JPanel();
        group = new ButtonGroup();
        openButton = new JButton();
        progressBar = new JProgressBar();
        textFieldFilePath  = new JTextField();
        textForScrollPane = new JTextArea(text);
        radioButtonA  = new JRadioButton();
        radioButtonB  = new JRadioButton();
        radioButtonC  = new JRadioButton();
        scrollPanel  = new JScrollPane(textForScrollPane, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    }

    public void makeFrame()
    {       
        isDrawed = false;
        okButtonIsPressed = false;

        //Settings for the Frame
        guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        guiFrame.setSize(500,500);
        guiFrame.setLocationRelativeTo(null);
        guiFrame.setVisible(true);

        //Give the right names to the buttons and textfields
        okButton.setText("OK");
        openButton.setText("Open");
        textFieldFilePath.setText("...Choos path...");
        radioButtonA.setText("Option a");
        radioButtonB.setText("option b");
        radioButtonC.setText("option c");

        //Make a buttonGroup for the radio buttons, for easy use
        group.add(radioButtonA);
        group.add(radioButtonB);
        group.add(radioButtonC);

        //Set the textForScrollPane
        textForScrollPane.setLineWrap(true);
        textForScrollPane.setEditable(false);
        textForScrollPane.setWrapStyleWord(true);

        //Settings for the progressbar
        progressBar = new JProgressBar(0, 100);
        progressBar.setValue(50);
        progressBar.setForeground(Color.blue);
        progressBar.setStringPainted(true);
        isDrawed = true;
        System.out.println("~~~~~~drawed");

        makePanelLayout();
    }

    public void panelActions()
    {
        //Make a new thread to update the frame and make progress on the same time
        Runnable runner = new Runnable()
        {
            @Override
            public void run() 
            {
                System.out.println("running");

                okButton.setActionCommand("ok");
                okButton.addActionListener(new ActionListener()
                {
                    @Override
                    public void actionPerformed(ActionEvent evt) 
                    {
                        okButton.setEnabled(false);
                        Container container = guiFrame.getContentPane();
                        container.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                        done = false;
                        okButtonIsPressed = true;
                   }
                });

                openButton.addActionListener(new ActionListener()
                {
                    @Override
                    public void actionPerformed(ActionEvent evt)
                    {
                        openButton.setEnabled(false);
                        String path = "C:\\Users\\";
                        String openPath = menu.ChooseFile(path);
                        textFieldFilePath.setText(openPath);                        
                    }
                });

                task.addPropertyChangeListener(new PropertyChangeListener()
                {
                    @Override
                    public void propertyChange(PropertyChangeEvent evt) 
                    {
                        if ("progress" == evt.getPropertyName()) 
                        {
                            int progress = (Integer) evt.getNewValue();
                            progressBar.setIndeterminate(false);
                            progressBar.setValue(progress);
                            System.out.println("update progress " + progress);
                            //scrollPanel.add(String.format("Completed %d%% of task.\n", progress), guiFrame);
                        }
                    }
                });
                task.execute();
            };
        };
        Thread tProgressbar = new Thread(runner, "Update progressbar");
        tProgressbar.start();
    }

    public void makePanelLayout()
    {
        GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 176, Short.MAX_VALUE));        
        mainPanelLayout.setVerticalGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 0, Short.MAX_VALUE));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(guiFrame.getContentPane());
        guiFrame.getContentPane().setLayout(layout);

        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(scrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 364, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createSequentialGroup()
                                    .addGap(106, 106, 106)
                                    .addComponent(okButton))
                                    .addComponent(radioButtonA)
                                .addComponent(radioButtonB)
                                .addComponent(radioButtonC))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(dotPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 364, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(textFieldFilePath, javax.swing.GroupLayout.PREFERRED_SIZE, 287, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(18, 18, 18)
                            .addComponent(openButton)))
                    .addContainerGap(39, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(22, 22, 22)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(dotPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(radioButtonA)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(radioButtonB)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(radioButtonC)))
                    .addGap(18, 18, 18)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(textFieldFilePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(openButton))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addComponent(okButton)
                    .addGap(18, 18, 18)
                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(scrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
    }
}

__________________________
the other class:
__________________________
package gui;

import java.awt.Container;
import java.awt.Cursor;
import java.awt.Toolkit;
import java.util.List;
import java.util.Random;

import javax.swing.JLabel;
import javax.swing.SwingWorker;

class Task extends SwingWorker<Void, Integer> 
{
    public int progress = 0;
    UserInterface use = new UserInterface();

    @Override
    public Void doInBackground() {
        Random random = new Random();
        progress = 0;
        setProgress(0);

        //Sleep for at least one second to simulate "startup".
        try 
        {
            Thread.sleep(1000 + random.nextInt(2000));
        } 
        catch (InterruptedException ignore) {}

        if(use.isDrawed && use.okButtonIsPressed)
        {
            while (progress < 100) 
            {
                //Sleep for up to one second.
                try 
                {
                    Thread.sleep(random.nextInt(1000));
                } 
                catch (InterruptedException ignore) {}

                //Make random progress.
                progress += random.nextInt(10);
                System.out.println("progress" + progress);
                publish(progress);
                use.text = "progress " + progress;
                System.out.println("text updated");
                use.scrollPanel.setViewportView(new JLabel("progress " + progress));
                setProgress(Math.min(progress, 100));
            }
        }
        return null;
    }

    @Override
    protected void process(List<Integer> chunks) 
    {
        System.out.println("in the process");
        if(chunks != null && use.isDrawed)
        {
            for (int chunk : chunks) 
            {
                if(chunk > 0)
                {
                    use.progressBar.setValue(chunk);
                    System.out.println("chunk " + chunk);
                }
            }
        }
    }

    public void done() 
    {
        Toolkit.getDefaultToolkit().beep();
        use.okButton.setEnabled(true);        
        Container container = use.guiFrame.getContentPane();
        progress = 100;
        container.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }

    public int getLengthOfTask() 
    {
        return progress;
    }
}   

错误:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@4a53fb57,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=OK,defaultCapable=true] is not attached to a horizontal group
at javax.swing.GroupLayout.checkComponents(GroupLayout.java:1065)
at javax.swing.GroupLayout.prepare(GroupLayout.java:1019)
at javax.swing.GroupLayout.layoutContainer(GroupLayout.java:889)
at java.awt.Container.layout(Container.java:1419)
at java.awt.Container.doLayout(Container.java:1408)
at java.awt.Container.validateTree(Container.java:1505)
at java.awt.Container.validateTree(Container.java:1511)
at java.awt.Container.validateTree(Container.java:1511)
at java.awt.Container.validateTree(Container.java:1511)
at java.awt.Container.validate(Container.java:1478)
at java.awt.Window.dispatchEventImpl(Window.java:2482)
at java.awt.Component.dispatchEvent(Component.java:4488)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:674)
at java.awt.EventQueue.access$400(EventQueue.java:81)
at java.awt.EventQueue$2.run(EventQueue.java:633)
at java.awt.EventQueue$2.run(EventQueue.java:631)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:647)
at java.awt.EventQueue$3.run(EventQueue.java:645)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:644)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

谢谢您的帮助 :)

4

0 回答 0