Я хочу изменить внутренний размер ScrollPane.
Я пробовал разные способы сделать это, но не смог. Я хочу, чтобы при каждом создании задач длина ScrollPane менялась. (Он определяет, заполнена ли JPanel, а затем увеличивается длина полосы прокрутки).
У меня есть класс Task (это просто то, что генерирует задачи)
Это мой класс List (помещает задачи в список):
package com.chri_stw.todolist;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.GridLayout;
import javax.swing.JPanel;
public class List extends JPanel {
private int cornerRadius; // Allows customization of the corner radius
List() {
this.cornerRadius = 30; // Default corner radius
GridLayout layout = new GridLayout(10, 1);
layout.setVgap(5); // Vertical gap between components
this.setLayout(layout);
this.setPreferredSize(new Dimension(400, 400)); // Preferred size
this.setBackground(Color.cyan);
add(new Task());
setOpaque(false); // Set the panel to be non-opaque to show rounded corners
}
// Override paintComponent to add rounded edges
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Smooth edges
g2.setColor(getBackground());
g2.fillRoundRect(0, 0, getWidth(), getHeight(), cornerRadius, cornerRadius); // Draw rounded background
super.paintComponent(g2);
g2.dispose();
}
public void updateNumbers() {
Component[] listItems = this.getComponents();
for (int i = 0; i < listItems.length; i++) {
if (listItems instanceof Task) {
((Task) listItems).changeIndex(i + 1); // Update task index
}
}
revalidate(); // Ensure layout recalculation
repaint(); // Ensure the panel is redrawn
}
public void removeCompletedTasks() {
for (Component c : getComponents()) {
if (c instanceof Task) {
if (((Task) c).getState()) {
remove(c); // Remove completed tasks
}
}
}
updateNumbers(); // Update task indices
revalidate(); // Recalculate layout after removing tasks
repaint(); // Redraw the panel
}
// Method to add tasks to the list
public void addTask(Task task) {
this.add(task); // Add task to the panel
revalidate(); // Ensure that layout updates after adding the task
repaint(); // Redraw the panel to reflect the new task
}
// Force setting the size explicitly, in case revalidation does not update it
@Override
public Dimension getPreferredSize() {
return new Dimension(350, 560); // Ensure preferred size
}
}
А это AppFrame (завершает весь пользовательский интерфейс):
package com.chri_stw.todolist;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicScrollBarUI;
public class AppFrame extends JFrame {
private TitleBar title;
private Footer footer;
private List list;
private JButton newTask;
private JButton clear;
AppFrame() {
// Set default frame properties
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
// Initialize components
title = new TitleBar();
footer = new Footer();
list = new List();
JScrollPane scrollPane = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JScrollBar scroll = scrollPane.getVerticalScrollBar();
scrollPane.setBorder(null);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setUI(new BasicScrollBarUI() {
@Override
protected void configureScrollBarColors() {
this.thumbColor = Color.gray;
}
});
scroll.setUnitIncrement(1); // Smooth scrolling
scroll.setForeground(Color.gray);
add(scrollPane);
// Add components to the frame
this.setLayout(new BorderLayout());
this.add(title, BorderLayout.NORTH);
this.add(footer, BorderLayout.SOUTH);
this.add(scrollPane, BorderLayout.CENTER);
// Initialize footer buttons
newTask = footer.getNewTask();
clear = footer.getClear();
// Add listeners to buttons
addListeners();
// Adjust frame size and make it visible
this.setPreferredSize(new Dimension(400, 700));
this.pack(); // Adjust size based on preferred sizes
this.setLocationRelativeTo(null); // Center the frame on the screen
this.setVisible(true);
}
public void addListeners() {
// Listener for "New Task" button
newTask.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
Task task = new Task();
list.add(task);
list.updateNumbers();
task.getDone().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
task.toggleState(); // Toggle the task's state
list.updateNumbers();
revalidate();
}
});
}
});
// Listener for "Clear" button
clear.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
list.removeCompletedTasks(); // Remove completed tasks
repaint();
}
});
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... scrollpane
Как изменить длину ScrollPane? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение