简体   繁体   中英

Java Swing ComboBox not editabl *with MCVE*

I've come across a very weird problem. I had a JPanel which contains JTextFields and JComboBoxes. I can change the JComboBox's when the JPanel loads but as soon as I touch or edit one of the JTextFields it doesn't let me change any of the combobox's...

Here is an MCVE that works. You can use it straight away and you'll see the error.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;


public class Main extends JFrame{

    private static JTextField s;
    private static JTabbedPane tabbedPane;
    private static JPanel config;
    private static JComboBox<Object> dns;
    private static JComboBox<Object> dnsmm;
    private static JButton save;
    private static String interval;
    private static String dnsen;
    private static String dnsm;
    private static JPanel server;
    static JPanel contentPane;

    public static void main(String[] args) throws InterruptedException {

            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        Main frame = new Main();
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
    }


    public Main() throws IOException {

        setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 655, 470);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(1, 1));
        setContentPane(contentPane);

        tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        contentPane.add(tabbedPane, BorderLayout.CENTER);

        setResizable(false);

        server = new JPanel();
        server.setLayout(new BorderLayout(0, 0));

        ServerPanel();
    }

    public static void ServerPanel() throws IOException{ 

        tabbedPane.addTab("Manage Server", server);
        InputStream in = new FileInputStream("config.dedserver");
        Properties p = new Properties();
        p.load(in);
        in.close();
        String saveInt = p.getProperty("saveInterval");
        String dnse = p.getProperty("enableDns");
        String dnsmo = p.getProperty("serverMode");

        config = new JPanel();
        server.add(config, BorderLayout.CENTER);    
        config.setLayout(new BoxLayout(config, BoxLayout.PAGE_AXIS));


        //saveint
        Panel panel_6 = new Panel();
        config.add(panel_6);
        JLabel sl = new JLabel("Save Interval (milliseconds):    ");
        panel_6.add(sl);
        s = new JTextField(saveInt);
        panel_6.add(s);
        s.setColumns(10);

        //dnsenabled
        Panel panel_9 = new Panel();
        config.add(panel_9);
        JLabel dnsl = new JLabel("DNS Enabled:    ");
        panel_9.add(dnsl);
        String[] dnsS = { "true", "false" };
        dns = new JComboBox<Object>(dnsS);
        dns.setSelectedItem(dnse);
        dns.addActionListener(dns);
        panel_9.add(dns);


        //dnsmode
        Panel panel_10 = new Panel();
        config.add(panel_10);
        JLabel dnsml = new JLabel("DNS Server Mode:    ");
        panel_10.add(dnsml);
        String[] dnsm = { "local", "remote" };
        dnsmm = new JComboBox<Object>(dnsm);
        dnsmm.setSelectedItem(dnsmo);
        dnsmm.addActionListener(dnsmm);
        panel_10.add(dnsmm);

        JPanel panel_7= new JPanel();
        config.add(panel_7);
        save = new JButton("Save");
        panel_7.add(save);
        save.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                errorCheck();       
            }
        });
    }

    public static void errorCheck(){
        interval = s.getText();
        dnsen = (String) dns.getSelectedItem();
        dnsm = (String) dnsmm.getSelectedItem();

        interval = checkValues(interval, "60000", "save interval");
        saveValues();
    }

    public static String checkValues(String value, String def, String name){
        String val;
        try{
            Long.parseLong(value);
            val = ""+value+"";
        }catch(NumberFormatException e){
            JOptionPane.showMessageDialog(null, "You did not enter a valid number for the "+ name + " field! It has been set to the default.");
            val = def;
        }
        return val;
    }

    public static void saveValues(){
        try {
                Properties props = new Properties();
                props.setProperty("saveInterval", interval);
                props.setProperty("serverMode", dnsm);
                props.setProperty("enableDns", dnsen);

                File f = new File("config.dedserver");
                OutputStream out = new FileOutputStream(f);
                props.store(out, "");

            JOptionPane.showMessageDialog(null, "Saved Config Values!");

            }
            catch (Exception e ) {
                e.printStackTrace();
                }

        }
}

For it to work you will also need to make a config.dedserver in the root of the project and add the following stuff into it:

#
#Thu Jul 09 08:29:33 BST 2015
saveMethod=h2
startingGems=9999999999
enableDns=true
startingGold=9999999999
startingDarkElixir=9999999999
startingElixir=9999999999
serverMode=remote
saveInterval=30000
maxNameChanges=100

For the entire ServerPanel.java code it is here: http://pastebin.com/tvBENHQa

I'm not sure why this isn't working. Does anyone have any ideas?

Thank you!

A real MVCE would have been stripped down a lot further. It would also have included the properties instead of relying on an external file, eg

Properties p = new Properties();

p.put("saveMethod","h2");
p.put("startingGems","9999999999");
p.put("enableDns","true");
p.put("startingGold","9999999999");
p.put("startingDarkElixir","9999999999");
p.put("startingElixir","9999999999");
p.put("serverMode","remote");
p.put("saveInterval","30000");
p.put("maxNameChanges","100");

But apart from that, the code provided at least allowed us to reproduce the problem.

The problem is that you are mixing Swing components with AWT components. You have lines like

Panel panel_10 = new Panel();

in your program. Switch from a java.awt.Panel to a javax.swing.JPanel

JPanel panel_10 = new JPanel();

and your problem will be solved.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM