【问题标题】:JScrollPane not working as intended, why?JScrollPane 没有按预期工作,为什么?
【发布时间】:2016-02-18 19:30:24
【问题描述】:

通过向 else-if 逻辑添加另外 6 个分支来编辑动作侦听器。每个 分支会将 actionCommand 与 6 个子菜单项进行比较:Metal、Motif、 窗口、从不、始终和按需。

一个。每个 Look and Feel 子菜单项都将使用 try-catch 语句来设置 适当的外观和感觉,如果出现这种情况,则显示错误消息 没有完成。

b.每个 Scroll Bars 子菜单项将设置水平和垂直滚动 将政策限制为适当的值。

c。任何已经创建的组件都需要更新。这个 可以通过调用 SwingUtilities.updateComponentTreeUI 方法来完成,将要更新的组件的引用作为参数传递。具体来说,您需要添加该行

SwingUtilities.updateComponentTreeUIgetContentPane());

到您刚刚添加到逻辑结构的每个分支。

我的代码是这样的......它正在崩溃,我完全不知道为什么。任何帮助表示赞赏。

package src.javaapplication5;


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

public class NoteTaker extends JFrame {
    //constants for set up of note taking area

    public static final int WIDTH = 600;
    public static final int HEIGHT = 300;
    public static final int LINES = 13;
    public static final int CHAR_PER_LINE = 45;

    //objects in GUI
    private JTextArea theText;      //area to take notes
    private JMenuBar mBar;  //horizontal menu bar
    private JPanel textPanel;   //panel to hold scrolling text area 
    private JMenu notesMenu;    //vertical menu with choices for notes

    //****THESE ITEMS ARE NOT YET USED.  YOU WILL BE CREATING THEM IN THIS LAB
    private JMenu viewMenu; //vertical menu with choices for views  
    private JMenu lafMenu;  //vertical menu with look and feel
    private JMenu sbMenu;   //vertical menu with scroll bar option
    private JScrollPane scrolledText;   //scroll bars   

    //default notes
    private String note1 = "No Note 1.";
    private String note2 = "No Note 2.";

    /**
     * constructor
     */
    public NoteTaker() {
        //create a closeable JFrame with a specific size
        super("Note Taker");
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //get contentPane and set layout of the window
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());

        //creates the vertical menus 
        createNotes();
        createViews();

        //creates horizontal menu bar and 
        //adds vertical menus to it
        mBar = new JMenuBar();
        mBar.add(notesMenu);
        mBar.add(viewMenu);
        //****ADD THE viewMenu TO THE MENU BAR HERE
        setJMenuBar(mBar);

        //creates a panel to take notes on
        textPanel = new JPanel();
        textPanel.setBackground(Color.blue);
        JTextArea theText = new JTextArea(LINES, CHAR_PER_LINE);
        theText.setBackground(Color.white);

        JScrollPane scrolledText = new JScrollPane(theText);

        //****CREATE A JScrollPane OBJECT HERE CALLED scrolledText
        //****AND PASS IN theText, THEN 
        //****CHANGE THE LINE BELOW BY PASSING IN scrolledText
        textPanel.add(scrolledText);

        contentPane.add(textPanel, BorderLayout.CENTER);
    }

    /**
     * creates vertical menu associated with Notes menu item on menu bar
     */
    public void createNotes() {
        notesMenu = new JMenu("Notes");
        JMenuItem item;

        item = new JMenuItem("Save Note 1");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Save Note 2");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Open Note 1");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Open Note 2");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Clear");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Exit");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);
    }

    /**
     * creates vertical menu associated with Views menu item on the menu bar
     */
    public void createViews() {

        viewMenu = new JMenu("Views");
        viewMenu.setMnemonic(KeyEvent.VK_V);

        createLookAndFeel();
        createScrollBars();

        lafMenu.addActionListener(new MenuListener());
        sbMenu.addActionListener(new MenuListener());

        viewMenu.add(lafMenu);
        viewMenu.add(sbMenu);

    }

    /**
     * creates the look and feel submenu
     */
    public void createLookAndFeel() {

        lafMenu = new JMenu("Look and Feel");
        lafMenu.setMnemonic(KeyEvent.VK_L);

        JMenuItem metalItem;
        JMenuItem motifItem;
        JMenuItem windowsItem;

        metalItem = new JMenuItem("Metal");
        metalItem.addActionListener(new MenuListener());

        motifItem = new JMenuItem("Motif");
        motifItem.addActionListener(new MenuListener());

        windowsItem = new JMenuItem("Windows");
        windowsItem.addActionListener(new MenuListener());

        lafMenu.add(metalItem);
        lafMenu.add(motifItem);
        lafMenu.add(windowsItem);

    }

    /**
     * creates the scroll bars submenu
     */
    public void createScrollBars() {

        sbMenu = new JMenu("Scroll Bars");
        sbMenu.setMnemonic(KeyEvent.VK_S);

        JMenuItem neverItem;
        JMenuItem alwaysItem;
        JMenuItem asneededItem;

        neverItem = new JMenuItem("Never");
        neverItem.addActionListener(new MenuListener());

        alwaysItem = new JMenuItem("Always");
        alwaysItem.addActionListener(new MenuListener());

        asneededItem = new JMenuItem("As Needed");
        asneededItem.addActionListener(new MenuListener());

        sbMenu.add(neverItem);
        sbMenu.add(alwaysItem);
        sbMenu.add(asneededItem);

    }

    private class MenuListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            String actionCommand = e.getActionCommand();
            if (actionCommand.equals("Save Note 1")) {
                note1 = theText.getText();
            } else if (actionCommand.equals("Save Note 2")) {
                note2 = theText.getText();
            } else if (actionCommand.equals("Clear")) {
                theText.setText("");
            } else if (actionCommand.equals("Open Note 1")) {
                theText.setText(note1);
            } else if (actionCommand.equals("Open Note 2")) {
                theText.setText(note2);
            } else if (actionCommand.equals("Exit")) {
                System.exit(0);
            } else if (actionCommand.equals("Metal")) {
                try {
                    UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(getContentPane());
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }
            } else if (actionCommand.equals("Motif")) {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(getContentPane());
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }

            } else if (actionCommand.equals("Windows")) {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(getContentPane());
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }

            } else if (actionCommand.equals("Never")) {
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            } else if (actionCommand.equals("Always")) {
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            } else if (actionCommand.equals("As Needed")) {
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            } //****ADD 6 BRANCHES TO THE ELSE-IF STRUCTURE
            //****TO ALLOW ACTION TO BE PERFORMED FOR EACH
            //****MENU ITEM YOU HAVE CREATED
            else {
                theText.setText("Error in memo interface");
            }
        }
    }

    public static void main(String[] args) {
        NoteTaker gui = new NoteTaker();
        gui.setVisible(true);
    }
}

【问题讨论】:

  • 我在这里并没有真正看到具体的问题...我运行了您的代码,是的,这里和那里发生了一些异常。我建议您更改 main() 以在事件调度线程中创建 gui。使用 SwingUtilities.invokeLater()。阅读docs.oracle.com/javase/tutorial/uiswing/concurrency/… 以获得解释。
  • 当我尝试单击子菜单中的滚动条选项时,我不明白异常是什么意思。

标签: java swing jscrollpane


【解决方案1】:

很多问题,请与您的代码进行比较

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

public class NoteTaker {
    //constants for set up of note taking area

    public static final int WIDTH = 600;
    public static final int HEIGHT = 300;
    public static final int LINES = 13;
    public static final int CHAR_PER_LINE = 45;
    //
    private JFrame frame = new JFrame("Note Taker");

    //objects in GUI
    private JTextArea theText;      //area to take notes
    private JMenuBar mBar;  //horizontal menu bar
    private JPanel textPanel;   //panel to hold scrolling text area 
    private JMenu notesMenu;    //vertical menu with choices for notes

    //****THESE ITEMS ARE NOT YET USED.  YOU WILL BE CREATING THEM IN THIS LAB
    private JMenu viewMenu; //vertical menu with choices for views  
    private JMenu lafMenu;  //vertical menu with look and feel
    private JMenu sbMenu;   //vertical menu with scroll bar option
    private JScrollPane scrolledText;   //scroll bars   

    //default notes
    private String note1 = "No Note 1.";
    private String note2 = "No Note 2.";

    /**
     * constructor
     */
    public NoteTaker() {
        //create a closeable JFrame with a specific size
        //setSize(WIDTH, HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //get contentPane and set layout of the window
        //Container contentPane = frame;
        //contentPane.setLayout(new BorderLayout());
        //creates the vertical menus 
        createNotes();
        createViews();

        //creates horizontal menu bar and 
        //adds vertical menus to it
        mBar = new JMenuBar();
        mBar.add(notesMenu);
        mBar.add(viewMenu);
        //****ADD THE viewMenu TO THE MENU BAR HERE
        frame.setJMenuBar(mBar);

        //creates a panel to take notes on
        textPanel = new JPanel(new BorderLayout());
        textPanel.setBackground(Color.blue);
        textPanel.setBorder(new EmptyBorder(5,5,5,5));
        /*JTextArea*/ theText = new JTextArea(LINES, CHAR_PER_LINE);
        theText.setBackground(Color.white);

        /*JScrollPane*/ scrolledText = new JScrollPane(theText);

        //****CREATE A JScrollPane OBJECT HERE CALLED scrolledText
        //****AND PASS IN theText, THEN 
        //****CHANGE THE LINE BELOW BY PASSING IN scrolledText
        textPanel.add(scrolledText);

        frame.add(textPanel/*, BorderLayout.CENTER*/);
        frame.pack();
        frame.setVisible(true);
    }

    /**
     * creates vertical menu associated with Notes menu item on menu bar
     */
    public void createNotes() {
        notesMenu = new JMenu("Notes");
        JMenuItem item;

        item = new JMenuItem("Save Note 1");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Save Note 2");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Open Note 1");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Open Note 2");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Clear");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Exit");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);
    }

    /**
     * creates vertical menu associated with Views menu item on the menu bar
     */
    public void createViews() {

        viewMenu = new JMenu("Views");
        viewMenu.setMnemonic(KeyEvent.VK_V);

        createLookAndFeel();
        createScrollBars();

        lafMenu.addActionListener(new MenuListener());
        sbMenu.addActionListener(new MenuListener());

        viewMenu.add(lafMenu);
        viewMenu.add(sbMenu);

    }

    /**
     * creates the look and feel submenu
     */
    public void createLookAndFeel() {

        lafMenu = new JMenu("Look and Feel");
        lafMenu.setMnemonic(KeyEvent.VK_L);

        JMenuItem metalItem;
        JMenuItem motifItem;
        JMenuItem windowsItem;

        metalItem = new JMenuItem("Metal");
        metalItem.addActionListener(new MenuListener());

        motifItem = new JMenuItem("Motif");
        motifItem.addActionListener(new MenuListener());

        windowsItem = new JMenuItem("Windows");
        windowsItem.addActionListener(new MenuListener());

        lafMenu.add(metalItem);
        lafMenu.add(motifItem);
        lafMenu.add(windowsItem);

    }

    /**
     * creates the scroll bars submenu
     */
    public void createScrollBars() {

        sbMenu = new JMenu("Scroll Bars");
        sbMenu.setMnemonic(KeyEvent.VK_S);

        JMenuItem neverItem;
        JMenuItem alwaysItem;
        JMenuItem asneededItem;

        neverItem = new JMenuItem("Never");
        neverItem.addActionListener(new MenuListener());

        alwaysItem = new JMenuItem("Always");
        alwaysItem.addActionListener(new MenuListener());

        asneededItem = new JMenuItem("As Needed");
        asneededItem.addActionListener(new MenuListener());

        sbMenu.add(neverItem);
        sbMenu.add(alwaysItem);
        sbMenu.add(asneededItem);

    }

    private class MenuListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            String actionCommand = e.getActionCommand();
            if (actionCommand.equals("Save Note 1")) {
                note1 = theText.getText();
            } else if (actionCommand.equals("Save Note 2")) {
                note2 = theText.getText();
            } else if (actionCommand.equals("Clear")) {
                theText.setText("");
            } else if (actionCommand.equals("Open Note 1")) {
                theText.setText(note1);
            } else if (actionCommand.equals("Open Note 2")) {
                theText.setText(note2);
            } else if (actionCommand.equals("Exit")) {
                System.exit(0);
            } else if (actionCommand.equals("Metal")) {
                try {
                    UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(frame);
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }
            } else if (actionCommand.equals("Motif")) {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(frame);
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }

            } else if (actionCommand.equals("Windows")) {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(frame);
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }

            } else if (actionCommand.equals("Never")) {
                //SwingUtilities.updateComponentTreeUI(frame);
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
                //SwingUtilities.updateComponentTreeUI(frame);
            } else if (actionCommand.equals("Always")) {
                //SwingUtilities.updateComponentTreeUI(frame);
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                //SwingUtilities.updateComponentTreeUI(frame);
            } else if (actionCommand.equals("As Needed")) {
                //SwingUtilities.updateComponentTreeUI(frame);
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
                //SwingUtilities.updateComponentTreeUI(frame);
            } //****ADD 6 BRANCHES TO THE ELSE-IF STRUCTURE
            //****TO ALLOW ACTION TO BE PERFORMED FOR EACH
            //****MENU ITEM YOU HAVE CREATED
            else {
                theText.setText("Error in memo interface");
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                NoteTaker gui = new NoteTaker();
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    你得到一个异常,因为 scrollText 为空。

    创建scrollText时,在构造函数中作为局部变量创建。

    JScrollPane scrolledText = new JScrollPane(theText);
    

    它也被声明为一个字段,但是由于它在构造函数中也被声明为一个局部变量,所以该字段永远不会被初始化。

    相反,只需这样做:

    scrolledText = new JScrollPane(theText);
    

    【讨论】:

    • 这是最简单的解决方案,我花了几个小时才弄清楚。非常感谢您的帮助!
    • 没问题。不过,将其标记为已回答。
    【解决方案3】:

    你的代码:

    else if (actionCommand.equals("Never")) {
    scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            } else if (actionCommand.equals("Always")) {
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            } else if (actionCommand.equals("As Needed")) {
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            }
    

    我的代码:

    else if (actionCommand.equals("Never")) {
                scrolledText.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            } 
            else if (actionCommand.equals("Always")) {
                scrolledText.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            } 
            else if (actionCommand.equals("As Needed")) {
                scrolledText.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            }
    

    【讨论】:

    • 您好,欢迎来到 StackOverflow。除了这个问题已经回答了几个月的事实,你能解释一下这是如何解决这个问题的吗?仅代码的答案在这里不太受欢迎。
    猜你喜欢
    • 2014-08-04
    • 2021-01-03
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2021-03-20
    相关资源
    最近更新 更多