0

何らかの理由でスクロールバーが表示されますが、機能していません。スクロールバーを使用してテキストエリアのテキストをスクロールすることが想定されています。なぜこれがうまくいかないのか誰か説明してもらえますか?

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

public class App extends JFrame{
    private JPanel paneel;

    public App(){   
        paneel = new AppPaneel();
        setContentPane(paneel);
    }

    public static void main(String args[]){
        JFrame frame = new App();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setTitle("Auto Clicker");
        frame.setVisible(true);
    }
}

class AppPaneel extends JPanel{
    private JTextField delayField, xLocation, yLocation;
    private JTextArea listArea;
    private JButton addButton, saveButton, runButton;
    private JScrollPane scroll;

    public AppPaneel(){
        setLayout(null);

        delayField = new JTextField();
        delayField.setBounds(10, 10, 85, 25);
        delayField.setText("delay in ms"); 

        xLocation = new JTextField();
        xLocation.setBounds(105, 10, 85, 25);
        xLocation.setText("X position"); 

        yLocation = new JTextField();
        yLocation.setBounds(200, 10, 85, 25);
        yLocation.setText("Y position");

        addButton = new JButton("Add");
        addButton.setBounds(295, 10, 75, 24);
        addButton.addActionListener(new AddHandler());

        listArea = new JTextArea();
        listArea.setBounds(10, 45, 360, 180);
        scroll = new JScrollPane(listArea);
        scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroll.setBounds(370, 45, 20, 180);

        saveButton = new JButton("Save");
        saveButton.setBounds(10, 230, 85, 24);

        runButton = new JButton("Run (F1)");
        runButton.setBounds(105, 230, 85, 24);
        runButton.addActionListener(new RunHandler());

        add(delayField);
        add(xLocation);
        add(yLocation);
        add(addButton);
        add(listArea);
        add(saveButton);
        add(runButton);
        add(scroll);
    }

    class AddHandler implements ActionListener{
        public void actionPerformed(ActionEvent a){
            listArea.setText(listArea.getText() + delayField.getText() + ",     " + xLocation.getText() + ", " + yLocation.getText() + ", " + "click;" + "\n");
        }
    }

    class RunHandler implements ActionListener{
        private Robot bot;
        private String text;
        int foo = Integer.parseInt("1234");
        public void actionPerformed(ActionEvent b) {
            try{
                text  = listArea.getText();
                bot = new Robot();
                for(String line : text.split("\\n")){
                int delay = Integer.parseInt((line.substring(0, 4)));
                int xpos = Integer.parseInt((line.substring(6, 10)));
                int ypos = Integer.parseInt((line.substring(12, 16)));
                bot.mouseMove(xpos, ypos);
                Thread.sleep(delay);
                bot.mousePress(InputEvent.BUTTON1_MASK);
                bot.mouseRelease(InputEvent.BUTTON1_MASK);
                }
            } 
            catch (AWTException | InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}
4

2 に答える 2

3

プログラムを台無しにするので、null レイアウトと setBounds を使用しないでください。これには理由があります。JTextArea の境界を設定することで、サイズが制限され、必要なときにサイズが大きくなりません。解決策は、いつものように、レイアウト マネージャーを学習して使用することです。JTextArea の列と行のプロパティを設定しますが、境界、サイズ、優先サイズは設定しません。

次はこれを行わないThread.sleep(delay);でください: Swing アプリケーションでは、アプリケーション全体がスリープ状態になるためです。遅延がある場合は、代わりにスイング タイマーを使用してください。チュートリアルは、これを使用するのに役立ちます。

非機能的なレイアウトの例:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;

@SuppressWarnings("serial")
public class App2 extends JPanel {
    private static final int GAP = 5;
    private JTextField textField1 = new JTextField(GAP);
    private JTextField textField2 = new JTextField(GAP);
    private JTextField textField3 = new JTextField(GAP);
    private JTextArea textArea = new JTextArea(15, 30);

    public App2() {
        JPanel topPanel = new JPanel(new GridLayout(1, 0, GAP, GAP));
        topPanel.add(textField1);
        topPanel.add(textField2);
        topPanel.add(textField3);
        topPanel.add(new JButton("Add"));

        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);
        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        JPanel bottomPanel = new JPanel(new GridLayout(1, 0, GAP, GAP));
        bottomPanel.add(new JButton("Save"));
        bottomPanel.add(new JButton("Run (F1)"));
        bottomPanel.add(new JLabel(""));
        bottomPanel.add(new JLabel(""));

        setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        setLayout(new BorderLayout(GAP, GAP));
        add(topPanel, BorderLayout.PAGE_START);
        add(scrollPane, BorderLayout.CENTER);
        add(bottomPanel, BorderLayout.PAGE_END);
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Auto Clicker");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new App2());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}
于 2016-01-21T19:52:29.667 に答える
2

あなたのアプローチ全体が間違っています。null レイアウトは使用しないでください。例えば:

scroll.setBounds(370, 45, 20, 180);

幅を 20 に設定しています。では、テキスト領域が 20 ピクセルで表示されることを期待するにはどうすればよいでしょうか? これは setBounds(...) を使用する際の問題であり、使用する乱数には意味がありません。レイアウトマネージャーに仕事を任せましょう。また:

add(listArea);

問題は、コンポーネントが 1 つの親しか持てないことです。最初に正しいテキスト領域で JScrollPane を作成しました。

ただし、テキスト領域をフレームに直接追加すると、テキスト領域がスクロール ペインから削除され、スクロール パネルが機能しなくなります。

そのステートメントを取り除き、スクロール ペインをフレームに追加するだけです。

ただし、これを最終的な解決策として使用することはお勧めしません。レイアウト マネージャーを使用する利点を理解していただき、コンポーネントを再度共有する必要がないように、現在の問題点について言及したいと思います。

適切な解決策は、「Community Wiki」で提案されているレイアウト マネージャーを使用することです。次に、レイアウト マネージャーが各コンポーネントのサイズと位置を決定するので、ピクセル値の正確な計算について心配する必要はありません。

于 2016-01-21T20:24:20.533 に答える