我正在使用当前最新的JRE jre1.8.0_66。
我的代码存在以下问题。我有一个带有BoxLayout(Y_AXIS)的jpanel到JScrollPane中,当我调整窗口大小时,我希望我的BoxLayout宽度总是适合可用空间的大小。
这是一些可以更好地解释我的问题的照片:
当消息到达可用的垂直空间时出现第一个问题,滚动条出现但是...我更喜欢调整面板一点来纠正水平尺寸,不显示水平滚动条,我只需要垂直条继续阅读所有消息。
这不是一个真正的问题,因为我可以使用垂直滚动条的策略来解决它。但如果可以的话,我更喜欢不要一直显示滚动条。
Minor Problem: When the scroll Appear
当我调整窗口大小时会出现真正的问题。如果我让窗户更大,一切都没问题,但......当我再次制作它时,水平尺寸继续相同的大小,我无法调整大小。
Big Problem: Resize width when I do less wide
我尝试了很多东西,听众在调整组件大小时会听,但是,我无法解决它。
这些是我的课程:
的MainView
lsof
ScrollPaneColor 这是ScrollPane无法正常工作。我只想要垂直滚动,而不是水平滚动。在这个类中,我有一个JPanel内容,在MainView中定义了一个BoxLayout(Y_AXIS)来添加我想要垂直滚动的内容。
我尝试了很多东西来解决我的问题,我做一个监听器调整大小,如果我做setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_NEVER);我的问题比现在还要严重。
package view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
public class MainView extends JFrame{
private JPanel content;
private ScrollPaneColor scrollPane;
public MainView() {
getContentPane().setLayout(new BorderLayout(0, 0));
/*
* Content Panel to scrollPane
*/
content = new JPanel();
content.setBackground(backgroundColor);
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
/*
* scrollPane
*/
scrollPane = new ScrollPaneColor(content, backgroundColor, grey);
/*
* Action Panel to add more content
*/
JPanel actions = new JPanel();
getContentPane().add(actions, BorderLayout.SOUTH);
actions.setLayout(new GridLayout(1, 0, 0, 0));
JButton btnAddBlue = new JButton("add Blue");
btnAddBlue.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
MessageFor blue = new MessageFor("This is just a test to see how the ScrollPane interacts with the view ", backgroundColor, paletteBlue);
content.add(blue);
content.updateUI();
}
});
actions.add(btnAddBlue);
JButton btnAddRed = new JButton("add Red");
btnAddRed.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
MessageFor red = new MessageFor("This is just a test to see how the ScrollPane interacts with the view ", backgroundColor, paletteRed);
content.add(red);
content.updateUI();
}
});
actions.add(btnAddRed);
/*
* Nothing important, only the Split Panel
*/
JPanel panel = new JPanel();
panel.setBackground(Color.BLACK);
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panel,scrollPane);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(150);
getContentPane().add(splitPane, BorderLayout.CENTER);
/*
* Nothing important, only the Title Panel
*/
JPanel title = new JPanel();
getContentPane().add(title, BorderLayout.NORTH);
JLabel lblNewLabel = new JLabel("title of actions");
title.add(lblNewLabel);
}
/*
* Nothing important, only the MAIN to run the program.
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MainView view = new MainView();
view.setVisible(true);
view.setSize(900, 450);
view.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/*
* Nothing important, only the PaletteColors and backgroundColor to decorate.
*/
private PaletteColor grey = new PaletteColor(
new Color(0xBFBFBF),
new Color(0xD8D8D8), new Color(0xF2F2F2), new Color(0xFFFFFF),
new Color(0xA5A5A5), new Color(0x7F7F7F),
new Color(0x000000), new Color(0x000000), new Color(0xFFFFFF));
private PaletteColor paletteRed = new PaletteColor(
new Color(0xDA1F28),
new Color(0xEB757B), new Color(0xF2A3A7), new Color(0xF8D1D3),
new Color(0xA3171E), new Color(0x6D0F14),
new Color(0xFFFFFF), new Color(0x000000), new Color(0xFFFFFF));
private PaletteColor paletteBlue = new PaletteColor(
new Color(0x4F81BD),
new Color(0x95B3D7), new Color(0xB8CCE4), new Color(0xDBE5F1),
new Color(0x366092), new Color(0x244061),
new Color(0xFFFFFF), new Color(0x000000), new Color(0xFFFFFF));
private Color backgroundColor = Color.WHITE;
}
MessageFor 带有x消息的JPanel,带有背景和调色板的颜色。这个JPanel很多次都会添加到ScrollPaneColor中,我们需要垂直滚动才能继续阅读它。
package view;
import java.awt.Color;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
/**
* Define a JScrollPane with the colors of the palette.
*
* @author Jorge Dacal Cantos
*
*/
public class ScrollPaneColor extends JScrollPane {
private JPanel content;
/**
* Create a <code>JScrollPane</code> with scrollbars as needed and
* personal colors
*
* @see #setViewportView
* @param panel The component to display in the scrollpane's viewport
* @param background The color for panel background.
* @param palette Palette with colors for scrollbars.
* @author Jorge Dacal Cantos
*/
public ScrollPaneColor(JPanel panel, Color background, PaletteColor palette) {
super(panel);
content = panel;
setBackground(background);
setBorder(null);
//setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_NEVER);
//setScrollsOnExpand(false);
/*
* irrelevant code, only changes the shape and color of the scrollBar
*
JScrollBar sb = getVerticalScrollBar();
sb.setUI(new ScrollBarColorUI(palette));
sb = getHorizontalScrollBar();
sb.setUI(new ScrollBarColorUI(palette));
*/
addComponentListener(new resizeListener());
}
/*
* listener to try to fix my problem resizing.
*/
class resizeListener extends ComponentAdapter {
public void componentResized(ComponentEvent e) {
//Recalculate the variable you mentioned
/*
System.out.println("I'm on resizeListener");
int width = getWidth();
int height = getHeight();
System.out.println("srollpane w: " + width + " scrollpane h: " + height);
System.out.println("content w: " + content.getWidth() + " content h: " + content.getHeight());
content.setSize(width, height);
content.getParent().setSize(width, height);
//content.revalidate();
System.out.println("content w: " + content.getWidth() + " content h: " + content.getHeight());
content.repaint();
*/
}
}
}
PaletteColor 仅用于装饰,但需要它才能尝试
package view;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.border.CompoundBorder;
import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
/**
* Define a <code>JPanel</code> with:
*
* * NORTH: <code>JPanel</code> panelNorth with BorderLayout:
* * CENTER: JLabel With date.
* * WEST: <code>JPanel</code> for Margin.
* * CENTER: <code>TextArea</code> with message for.
* * WEST: <code>JPanel</code> for Margin.
*
* @author Jorge Dacal Cantos
*/
public class MessageFor extends JPanel {
JLabel labelDate;
/**
* Create a <code>JPanel</code> with the message for, with the colors
* of the background and palette.
*
* @form message Message to show.
* @form background Background color of the panel.
* @form palette Colors for the message.
* @author Jorge Dacal Cantos
*/
public MessageFor(String message, Color background, PaletteColor palette) {
setBorder(new LineBorder(background, 10));
setBackground(background);
setLayout(new BorderLayout(0, 0));
JTextArea textAreaMensaje = new JTextArea(message);
textAreaMensaje.setColumns(40);
textAreaMensaje.setLineWrap(true);
BevelBorder borderTextExterior = new BevelBorder(BevelBorder.RAISED, palette.getAclaradoNv2(), palette.getAclaradoNv2(), palette.getEstandar(), palette.getEstandar());
LineBorder borderTextInterior = new LineBorder(palette.getAclaradoNv1(), 10, true);
textAreaMensaje.setBorder(new CompoundBorder(borderTextExterior, borderTextInterior));
textAreaMensaje.setEditable(false);
textAreaMensaje.setBackground(palette.getAclaradoNv1());
textAreaMensaje.setForeground(palette.getTextoEnAclarado());
textAreaMensaje.setSelectedTextColor(palette.getTextoEnEstandar());
textAreaMensaje.setSelectionColor(palette.getEstandar());
add(textAreaMensaje);
JPanel panelMarginWest = new JPanel();
FlowLayout flowLayout = (FlowLayout) panelMarginWest.getLayout();
flowLayout.setHgap(25);
panelMarginWest.setBackground(background);
add(panelMarginWest, BorderLayout.WEST);
JPanel panelNorth = new JPanel();
add(panelNorth, BorderLayout.NORTH);
panelNorth.setLayout(new BorderLayout(0, 0));
JPanel panelDate = new JPanel();
panelNorth.add(panelDate);
panelDate.setBackground(background);
Calendar date = Calendar.getInstance();
SimpleDateFormat formato = new SimpleDateFormat("hh:mm");
String DateWithFormat = formato.format(date.getTime());
panelDate.setLayout(new BorderLayout(0, 0));
labelDate = new JLabel(DateWithFormat);
labelDate.setHorizontalAlignment(SwingConstants.LEFT);
labelDate.setForeground(palette.getEstandar());
panelDate.add(labelDate);
JPanel panelMarginDate = new JPanel();
panelMarginDate.setBackground(background);
panelNorth.add(panelMarginDate, BorderLayout.WEST);
panelMarginDate.setLayout(new FlowLayout(FlowLayout.CENTER, 25, 5));
}
/**
* to add name next the date.
*
* @form name Name to show with the Date.
*/
public void especificarname(String name){
name = labelDate.getText() + " - for " + name;
labelDate.setText(name);
}
}
我希望你能帮助我,因为我已经不知道还有什么可以尝试的。我在这里和互联网上读过很多东西,没有什么能解决我的问题。
很抱歉我的问题很长,非常感谢大家。
最好的问候,豪尔赫