JOptionPane и функция прокрутки - PullRequest
9 голосов
/ 04 декабря 2011

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

Спасибо.

Ответы [ 4 ]

23 голосов
/ 04 декабря 2011

Вот пример использования JTextArea, встроенного в JScrollPane:

JTextArea textArea = new JTextArea("Insert your Text here");
JScrollPane scrollPane = new JScrollPane(textArea);  
textArea.setLineWrap(true);  
textArea.setWrapStyleWord(true); 
scrollPane.setPreferredSize( new Dimension( 500, 500 ) );
JOptionPane.showMessageDialog(null, scrollPane, "dialog test with textarea",  
                                       JOptionPane.YES_NO_OPTION);
4 голосов
/ 04 декабря 2011

Поместите объекты в JList или другой подобный компонент, поместите его в JScrollPane и поместите JScrollPane в JOptionPane.

3 голосов
/ 04 декабря 2011

Вы можете добавить любой JComponent(s) к JOptionPane , включая JScrollPane , содержащий JList

0 голосов
/ 10 января 2015

У меня была похожая потребность - JOptionPane с прокручиваемой текстовой областью, в которую мог писать любой из моих классов в моем приложении.Это должно было предоставить пользователю статус и информацию о прогрессе.Мой подход состоял в том, чтобы сделать это статическим классом, который я однажды создал, и любой класс мог вызвать его метод обновления для записи в него.Ниже приведен код и небольшой драйвер в надежде, что он сэкономит время.Это можно сделать не статичным, это просто соответствует моим потребностям.

package com.acme.view;

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import com.acme.controller.MyController;
import com.acme.utils.NonModalMessage;

public class MyView {

    private JFrame frame;
    private int dialogNum = 0;
    private MyController myCntrlr;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        NonModalMessage.createMesgDialog();
        NonModalMessage.updateMessage("Acme Anvil Targeting Progress");

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

    /**
     * Create the application.
     */
    public MyView() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 250, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        myCntrlr = new MyController();

        JButton btnMybutton = new JButton("myButton");

        btnMybutton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                NonModalMessage.setMessageVisible();
                if(dialogNum > 0 && dialogNum % 10 == 0){
                    NonModalMessage.clearMessage();
                    NonModalMessage.updateMessage("Acme Anvil Targeting Progress");
                    myCntrlr.someMethod("Controller reports Roadrunner sighted. Message Number: ", dialogNum);
                }
                NonModalMessage.getMessage();

                NonModalMessage.updateMessage("Message number: " + Integer.toString(dialogNum));
                System.out.println("dialogNum: " + dialogNum);
                dialogNum++;
            }
        });

        frame.getContentPane().add(btnMybutton, BorderLayout.NORTH);
    }


}

package com.acme.controller;
import com.acme.utils.NonModalMessage;

public class MyController {

    public MyController(){

    }

    public void someMethod(String mystring, int myInt){
        NonModalMessage.updateMessage(mystring + " "+ myInt);
    }

}

package com.acme.utils;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

public class NonModalMessage {
    private static JTextArea textArea = null;
    private static JOptionPane oPane   = null;
    private static JDialog dialog     = null;
    private static JScrollPane myjsPane = null;
    public NonModalMessage(){}

    public static void createMesgDialog(){

        textArea = new JTextArea(); 
        textArea.setLineWrap(true);  
        textArea.setWrapStyleWord(true); 
        myjsPane = new JScrollPane(textArea);
        myjsPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        oPane = new JOptionPane();
        oPane.add(myjsPane);    

        //final JDialog dialog = pane.createDialog(myPane, "Progress Dialog");
        dialog = oPane.createDialog(null, "");
        dialog.setTitle("Progress Messages");
        dialog.setModal(false); 
        dialog.setSize(400, 250);
        dialog.setResizable(true);
        dialog.setAlwaysOnTop(true);
    }

    public static void setMessageVisible(){
        dialog.setVisible(true);
    }

    public static void updateMessage(String newMessage){
        String mytext = textArea.getText();
        if(mytext.isEmpty()){
            textArea.setText(newMessage);
        }
        else{
            textArea.setText(mytext + "\n" + newMessage);
        }

        oPane.setMessage( myjsPane );
    }
    public static String getMessage(){
        return textArea.getText();
    }

    public static void clearMessage(){
        textArea.setText("");
        oPane.setMessage( myjsPane );
    }

}
...