- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
[最终编辑]
好的伙计们。
我不知道为什么它在我的聊天程序中不起作用......但我设法修复了 SSCCE.. 使用它现在可以工作的可滚动实现。谢谢大家!
代码:
package de.sky.cjat;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.Scrollable;
import javax.swing.UIManager;
public class MyKskb {
private int row;
class SomethingPanel extends JPanel implements Scrollable {
public SomethingPanel(LayoutManager manager){
super(manager);
}
@Override
public Dimension getPreferredScrollableViewportSize(){
return getPreferredSize();
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction){
return 5;
}
@Override
public boolean getScrollableTracksViewportHeight(){
return false;
}
@Override
public boolean getScrollableTracksViewportWidth(){
return true;
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction){
return 1;
}
}
public MyKskb(){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setPreferredSize(new Dimension(800, 600));
// final JPanel content = new JPanel(new GridBagLayout());
final SomethingPanel content = new SomethingPanel(new GridBagLayout());
// final JPanel empty = new JPanel();
// empty.setPreferredSize(new Dimension(0, 0));
// GridBagConstraints gbc = new GridBagConstraints();
// content.add(empty, gbc);
content.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "§");
content.getActionMap().put("§", new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e){
JPanel p = new JPanel(new BorderLayout());
p.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
p.setBackground(Color.GRAY);
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(10, 10, 10, 10);
gbc.weightx = 1.0;
gbc.gridx = 0;
gbc.gridy = row++;
gbc.fill = GridBagConstraints.HORIZONTAL;
// content.remove(empty);
// gbc.gridy = row;
// gbc.weighty = 1.0;
// content.add(empty, gbc);
JTextArea text = new JTextArea(
Math.random() > 0.5 ?
"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC" :
"FFFFFFFFFFFFABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC");
text.setLineWrap(true);
p.add(text);
content.add(p, gbc);
content.revalidate();
}
});
JScrollPane scrollPane = new JScrollPane(content);
f.pack();
f.setLocationRelativeTo(null);
f.add(scrollPane);
f.setVisible(true);
}
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new MyKskb();
}
}
[结束]
[问题]
我正在编写一个聊天程序,布局如下所示:
带有消息的面板有一个 GridBagLayout 并包装在一个 JScrollPane 中。
问题是,如果消息太长,消息面板会拉伸(stretch)并变得太大:
所以我想要实现的是限制面板的大小,它包含在 JScrollPane 中 - 如果文本变长而不是变宽,我希望带有消息文本的灰色面板增加它们的高度。 IE。在不增加面板宽度的情况下包装文本。
有没有办法通过网格包布局实现这一点,还是我遗漏了什么?或者我应该使用另一个布局管理器?
编辑:完整的层次结构:
JScrollPane
JPanel (gbl)
JPanel (custom painting)
JComponent (JLabel but it can vary)
JPanel (custom painting)
JComponent (JLabel but it can vary)
JPanel (custom painting)
JComponent (JLabel but it can vary)
....
编辑:我尝试像这样实现 Scrollable:
@Override
public Dimension getPreferredScrollableViewportSize(){
return new Dimension(100, getHeight());
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction){
return 5;
}
@Override
public boolean getScrollableTracksViewportHeight(){
return false;
}
@Override
public boolean getScrollableTracksViewportWidth(){
return true;
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction){
return 1;
}
但如果文本太长,同样的事情会发生...我不知道 getPreferredScrollableViewportSize
应该返回什么,而且 getSize()
也没有用...
编辑:这是一个 SSCCE,它显示了我的 GUI 的基本结构:(按回车键添加新组件)
package de.sky.cjat;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
public class Kskb {
private int row;
public Kskb(){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setPreferredSize(new Dimension(800, 600));
final JPanel content = new JPanel(new GridBagLayout());
final JPanel empty = new JPanel();
empty.setPreferredSize(new Dimension(0, 0));
GridBagConstraints gbc = new GridBagConstraints();
content.add(empty, gbc);
content.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "§");
content.getActionMap().put("§", new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e){
JPanel p = new JPanel();
p.setBackground(Color.GRAY);
JLabel text = new JLabel("ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC");
p.add(text);
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(10, 10, 10, 10);
gbc.weightx = 1.0;
gbc.gridy = row++;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.NORTHWEST;
content.add(p, gbc);
content.remove(empty);
gbc.gridy = row;
gbc.weighty = 1.0;
content.add(empty, gbc);
content.revalidate();
}
});
JScrollPane scrollPane = new JScrollPane(content);
f.pack();
f.setLocationRelativeTo(null);
f.add(scrollPane);
f.setVisible(true);
}
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new Kskb();
}
}
最佳答案
根据@durandal 的建议,问题出在 JLabel 上。 JLabel 不换行文本。所以你需要使用不同的组件。这是使用 JTextArea 修改的代码:
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.border.*;
public class Kskb {
private int row;
public Kskb()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setPreferredSize(new Dimension(800, 600));
// final JPanel content = new JPanel(new GridBagLayout());
final ScrollablePanel content = new ScrollablePanel(new GridBagLayout());
content.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
final GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(10, 10, 10, 10);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.fill = GridBagConstraints.HORIZONTAL;
content.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "");
content.getActionMap().put("", new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e)
{
JPanel p = new JPanel( new BorderLayout() );
p.setBorder( new EmptyBorder(10, 10, 10, 10) );
p.setBackground(Color.GRAY);
JTextArea text = new JTextArea();
text.append("ABCABCABCABCABCABCABCABC ABCABCABCABCABCABCABCABCABCABCABCABCABCABC ABCABCABCABCABCABCABCABCABCABCABCABCABCA BCABCABCABCABCABCABCAB CABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC");
text.setLineWrap( true );
p.add(text);
gbc.gridy = row++;
content.add(p, gbc);
content.revalidate();
}
});
JScrollPane scrollPane = new JScrollPane(content);
f.pack();
f.setLocationRelativeTo(null);
f.add(scrollPane);
f.setVisible(true);
}
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new Kskb();
}
}
关键是 Scrollable
实现,它强制调整面板宽度和调整框架。此代码使用 Scrollable Panel ,它只是 Scrollable
接口(interface)的可重用实现,您可以使用方法对其进行配置,而不是创建新类并重写这些方法。
关于java - 当包含在 GridBagLayout 中时,如何使我的面板换行文本并增加高度而不是宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29924478/
我需要从 1024 增加 FD_SETSIZE 值至 4096 .我知道最好使用 poll()/epoll()但我想了解什么是优点/缺点。主要问题是:我要重新编译glibc吗? ?我读了几个线程,其中
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我在 HTML 文件中有这样的内容: var value = 0; add(x){ x++; do
有没有办法在用户向上滚动时增加变量,并在用户使用 JavaScript 向下滚动时减少变量?变量没有最大值或最小值,如果能够调整灵敏度就好了。我不知道从哪里开始,感谢您的帮助! 编辑:没有滚动条,因为
我是 ios 新手,遇到以下问题。 我想根据表格 View 中元素的数量增加和减少表格 View 的高度大小。如果在输入时客户端在输出时给出 3 个或超过 3 个元素,我希望看到一个比默认行大 2 行
所以我一直在四处搜索,似乎大多数人认为以下列方式递增 indexPath 是正确的方法: NSIndexPath *newIndexPath = [NSIndexPath indexPathForRo
我有一个关于 connSupervisionTimeout 的问题。 我正在使用 CoreBluetooth 编写应用程序。我检查了连接参数和 connSupervisionTimeout = 720
我正在尝试根据页面的滚动位置更改元素的填充;当用户向下滚动页面时,填充会增加,而当他们向上滚动时,填充会减少。 我的主要问题是滚动不是很流畅,有时如果我滚动到页面顶部太快,每次元素的填充大小都不一样。
我正在尝试计算 18456 个基因的相关性度量,但编译器 (Dev C) 在将宏 GENE 或 INDEX 增加到 4000 到 5000 之间的值后退出或大。例如,它适用于: # define GE
我有一个带有 position: absolute 和 CSS3 过渡的圆形元素(a 元素)。在 hover 事件中,我想增加圆的高度和宽度,但我想在所有边上添加像素,而不仅仅是在左侧或右侧。 示例如
为了改善用户体验,我计划在我网站的所有页面(A-、A、A+)上增加/减少/重置字体大小 我面临的问题是页面上不同元素使用的字体大小不统一。有些是 14px,有些是 18px,有些是 12px,有些是
本文实例讲述了Yii框架数据库查询、增加、删除操作。分享给大家供大家参考,具体如下: Yii 数据库查询 模型代码: ?
sql替换语句,用该命令可以整批替换某字段的内容,也可以批量在原字段内容上加上或去掉字符。 命令总解:update 表的名称 set 此表要替换的字段名=REPLACE(此表要替换的字段名, '原
sql不常用函数总结以及事务,增加,删除触发器 distinct 删除重复行 declare @x 申明一个变量 convert(varchar(20),t
要增加我使用的最大可用内存: export SPARK_MEM=1 g 或者我可以使用 val conf = new SparkConf() .setMaster("loca
我正在尝试将文本(自定义文本按钮)放入 AppBar 的前导属性中。但是,当文本太长时,文本会变成多行 Scaffold( appBar: AppBar( centerTi
我正在使用最新版本的 NetBeans,我需要增加输出和菜单的字体大小(不是代码部分)。我试过: netbeans_default_options=".... --fontsize 16" 但是当我将
我必须将 180000 个点绘制到一个 EPS 文件中。 使用标准 gnuplot 输出尺寸点彼此太接近,这使得它们无法区分。有没有办法增加图像的宽度和高度? 最佳答案 是的。 set termina
我有一个带有输入字段的 twitter bootstrap 3 导航栏。我想增加输入字段的宽度。我已尝试设置 col 大小,但它不起作用。 html比较长,请引用bootply http://www.
我正在尝试增加 ggplot 标题中下划线的大小/宽度/厚度。我曾尝试使用大小、宽度和长度,但没有成功。 这是我所做的一个例子。 test <- tibble(x = 1:5, y = 1, z =
我是一名优秀的程序员,十分优秀!