Сделайте JScrollPanel динамически изменяемым с помощью чертежа JPanel - PullRequest
0 голосов
/ 21 января 2019

У меня есть JScrollPanel и JPanel, добавленные к нему.Я хотел бы нарисовать на JPanel и заставить полосы прокрутки JScrollPane появляться всякий раз, когда рисунок превышает размер панели, и иметь возможность прокручивать рисунок как по вертикали, так и по горизонтали.

Я пробовал консультироваться с различными форумамии официальные документы, и попробовал несколько вещей (установка границ, предпочтительный размер и т. д.), но ни один, кажется, не дает желаемых эффектов.

У меня есть JFrame (с GridBagLayout, кстати):

            JFrame frame1 = new JFrame("Application");
            frame1.setVisible(true);
            frame1.setMinimumSize(new Dimension(580,620));
            frame1.setResizable(false);
            frame1.setLocationRelativeTo(null);
            frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Соответствующие компоненты:

            JPanel panel1 = new JPanel();
            JScrollPane scrollPane = new JScrollPane(panel1);
            frame1.add(scrollPane, gbc_panel1); //added with layout constraints

JPanel:

            panel1.setBackground(Color.BLACK);
            panel1.setPreferredSize(new Dimension(500,500));
            panel1.setMinimumSize(new Dimension(360,360));
            panel1.setMaximumSize(new Dimension(1000,1000));

JScrollPane:

            scrollPane.setAutoscrolls(true);

Соответствующий код из события действия кнопки, выполняющей рисование:

            Graphics g;
            g = panel1.getGraphics();
            panel1.paint(g);
            g.setColor(new Color(0,128,0));

            /* this is followed by some more code that 
            does the drawing of a maze with g.drawLine() methods */

Код делаетрисунок отлично, я просто не могу понять, как сделать прокрутку и динамическое изменение размера.

Буду признателен за любые полезные комментарии или замечания!

Спасибо!

1 Ответ

0 голосов
/ 21 января 2019

В конечном итоге переписать метод рисования удалось, как и предложил @MadProgrammer. Я просто надеялся, что смогу рисовать, не определяя свой собственный класс JPanel, но похоже, что это не сработает.

Пользовательский класс выглядит так:

class Drawing extends JPanel {

int mazeSize;

public Drawing(JTextField jtf)
{
    try {
    this.mazeSize = Integer.parseInt(jtf.getText());
    }

    catch (Exception e) 
    {
        JOptionPane.showMessageDialog(this, "ERROR!  Invalid size value!");
    }
} // the constructor gets the size of the drawing from a textField

public Dimension getPreferredSize() {
    return new Dimension(mazeSize*10,mazeSize*10);
} //getPreferredSize - this method is used by the scroll pane to adjust its own size automatically

public void drawMaze (Graphics g) 
{
    /* some irrelevant code that does the desired drawing to the panel by calling g.drawLine()*/

} // drawMaze method that does the de facto drawing

@Override
public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    drawMaze(g);        
}// paintComponent() @Override method - this was the tricky part

}//Drawing JPanel subclass

Стоит также отметить (если какой-то нуб вроде меня наткнулся на этот вопрос), что после создания экземпляра нового подкласса JPanel в событии action мне пришлось добавить его в JScrollPanel следующим образом, а не просто просто используя метод add ():

Drawing drawPanel = new Drawing(textfield1);
scrollPane.getViewport().add(drawPanel);

Опять же, спасибо за предложение!

После завершения работы с программой (генератором случайных лабиринтов, использующим рекурсивный алгоритм обратного отслеживания) я предоставлю исходный код в моем профиле github .

...