标题解释了这个问题.我怎么能轻松做到这一点?
我需要在JScrollPane中创建一个带有可调整大小的列的JTable(当用户增加列宽时 - 出现水平滚动条).为此,我有用table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);.此外,当视口宽度足以包含整个表格时 - 列应该拉伸以填充视口宽度.为了实现这一点,我有getScrollableTracksViewportWidth()JTable类的覆盖方法如下:
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
Run Code Online (Sandbox Code Playgroud)
这种方法很有效,除了一件事:当我第一次尝试调整列的大小时,它返回自己的宽度以开始位置.如果我快速调整列大小并释放鼠标表继续工作正常.那么,这种行为的原因是什么?为什么表尝试调整大小,即使getScrollableTracksViewportWidth()返回false?或者,也许,你可以提出更好的解决方案来实现这样的调整大小模式?
贝娄是上述问题的简单工作示例:
import javax.swing.*;
public class TestTable {
private static Object[][] data = new Object[][] {
{ "a", "b", "c" },
{ "d", "e", "f" }
};
private static Object[] colNames = new Object[] { "1", "2", "3" };
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JTable table = new JTable(data, colNames) …Run Code Online (Sandbox Code Playgroud) 我一直试图JDesktopPane通过可调整大小的GUI和滚动窗格来很好地工作,但是我遇到了一些麻烦.似乎除非拖动模式是大纲,否则桌面窗格将不会按预期调整大小(当内部框架被拖动超出桌面窗格的边缘时),因此不会产生滚动条.

我在这个来源做一些非常愚蠢的事吗?我错过了一个更好的方法吗?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class MDIPreferredSize {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
final JDesktopPane dt = new JDesktopPane() {
@Override
public Dimension getPreferredSize() {
Dimension prefSize = super.getPreferredSize();
System.out.println("prefSize: " + prefSize);
// inititialize the max to the first normalized bounds
Rectangle max = getAllFrames()[0].getNormalBounds();
for (JInternalFrame jif : this.getAllFrames()) {
max.add(jif.getNormalBounds());
}
System.out.println("maxBounds(): "
+ max); …Run Code Online (Sandbox Code Playgroud) 这个问题是关于JEditorPaneJava 8和Java 9中的不同行为.我想知道其他人是否经历过相同的事情,是否它可能是Java 9中的一个错误,如果可能的话,你有如何在Java中处理它的输入9.
上下文:在我们(古老的)代码库中,我们使用的是子类JTable,并且在我们使用的子类之一的列中呈现多行HTML JEditorPane.我们JEditorPane.getPreferredSize()用于确定内容的高度并使用它来设置表格行的高度.它已经运作了很多年.它在Java 9中不起作用; 行显示只有10个像素高.在Windows和Mac上都可以看到.
我想向您展示两个代码示例.如果第一个和更短的一个适合您,请随意跳过第二个和更长的一个.
MCVE:
JEditorPane pane = new JEditorPane("text/html", "");
pane.setText("<html>One line</html>");
System.out.println(pane.getPreferredSize());
pane.setText("<html>Line one<br />Line 2<br />Third line<br />Line four</html>");
System.out.println(pane.getPreferredSize());
Run Code Online (Sandbox Code Playgroud)
Java 8(1.8.0_131)中的输出:
java.awt.Dimension[width=48,height=15]
java.awt.Dimension[width=57,height=60]
Run Code Online (Sandbox Code Playgroud)
在Java 9(jdk-9.0.4)上:
java.awt.Dimension[width=49,height=15]
java.awt.Dimension[width=58,height=0]
Run Code Online (Sandbox Code Playgroud)
在Java 9中,我第一次设置文本时,首选高度反映了它.以后每次都没有.
我已经搜索过,看看我是否能找到任何可能导致此问题的错误信息,但没有发现任何相关内容.
问题:这是否意图(改变)行为?这是一个错误?
public class TestJEditorPaneAsRenderer extends JFrame {
public TestJEditorPaneAsRenderer() {
super("Test JEditorPane");
MyRenderer renderer = new MyRenderer();
String html2 = "<html>one/2<br />two/2</html>";
String html4 = "<html>one of four<br />two of four<br />"
+ …Run Code Online (Sandbox Code Playgroud) 我在netbeans中创建了一个JFrame.但是当我运行程序时,Jframe的大小太小了.这是我的代码.
import javax.swing.JFrame;
public class Window {
private static void demo()
{
JFrame frame =new JFrame();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run()
{
demo();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)

我试图匹配JTable列宽取决于里面的数据.我的代码:
for(int column = 0; column < gui.testsuiteInfoTable.getColumnCount(); column ++){
int width =0;
for (int row = 0; row < gui.testsuiteInfoTable.getRowCount(); row++) {
TableCellRenderer renderer = gui.testsuiteInfoTable.getCellRenderer(row, column);
Component comp = gui.testsuiteInfoTable.prepareRenderer(renderer, row, column);
width = Math.max (comp.getPreferredSize().width, width);
System.out.println(width);
}
TableColumn col = new TableColumn();
col = gui.testsuiteInfoTable.getColumnModel().getColumn(column);
System.out.println(width);
col.setWidth(width);
gui.testsuiteInfoTable.revalidate();
}
}
Run Code Online (Sandbox Code Playgroud)
尺寸是正确的我猜,但表格列仍然都有相同的宽度!该表是嵌入在GridBagLayout中的ScrollPane中的那个问题?谢谢你的任何建议.
Autolayout将随机剪辑我的UITextView中的文本.当您从横向到纵向来回旋转时,它会更改UITextContainerView的大小.它会正常工作几次,但会随机更改容器并剪切静态文本.
如果我禁用Autolayout,那么问题就会消失.如果我删除preferredFontForTextStyle代码并保持Autolayout,它似乎也会消失.
问题是我想让用户设置文本大小并能够使用自动布局.文本都是静态的,所以这应该是一件简单的事情.
有没有人见过这个?这是一个错误还是必须做错误的事情?
为了尝试找出问题,我已经将代码缩小到尽可能小.
这是代码
// BugTest_ViewController.h
//
//
//
//
#import <UIKit/UIKit.h>
@interface BugTest_ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIImageView *image1;
@property (weak, nonatomic) IBOutlet UITextView *text1;
@endRun Code Online (Sandbox Code Playgroud)
// BugTest_ViewController.m
//
//
//
//
#import "BugTest_ViewController.h"
@interface BugTest_ViewController ()
@end
@implementation BugTest_ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)viewWillAppear:(BOOL)animated
{
self.text1.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
[self.text1 setContentOffset:CGPointZero animated:YES];
}Run Code Online (Sandbox Code Playgroud)
当视图看起来应该是Good Container时,这是 容器
这是查看视图时的容器. 坏容器剪辑我的文本
我在JScrollPane中有一个JList,它放在一个JPanel(BorderLayout.CENTER)中,然后放在另一个JPanel的BorderLayout.EAST(这个JPanel的CENTER包含另一个JPanel)中,整个JPanel放在一个JTabbedPane中.最初,它看起来像这样:

现在我在列表中添加一些书籍:

如果我转到另一个标签然后回来,会发生这种情况:

我不明白的是,包含JList的JPanel都设置了最小和最大大小:
JPanel listPanel = new JPanel();
listPanel.setLayout(new BorderLayout());
listPanel.add(new JScrollPane(bookList), BorderLayout.CENTER);
listPanel.setMinimumSize(listPanel.getPreferredSize());
listPanel.setMaximumSize(listPanel.getPreferredSize());
checkOutPanel.add(listPanel, BorderLayout.EAST);
Run Code Online (Sandbox Code Playgroud)
如何防止JList自动调整大小?
我尝试了setPrefferedSize和setSize方法,但对话框仍以最小尺寸打开.
private void method() {
commandDialog.setPreferredSize(new Dimension(100,100));
- - -
- - - //Components added to dialogPanel
commandDialog.add(dialogPanel);
// Tried this as well: commandDialog.setSize(40, 40);
commandDialog.validate();
commandDialog.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud) 我已经搜索过这样的所有问题,但我找不到解决方案.
public class FormPanel extends JPanel
{
private JLabel namelabel;
private JLabel occlabel;
private JTextField nametext;
private JTextField occtext;
private JButton okButton;
public FormPanel() {
Dimension dim = getPreferredSize();
dim.width = 250;
setPreferredSize(dim);
namelabel = new JLabel("Name : ");
occlabel = new JLabel("Occupation : ");
nametext = new JTextField();
nametext.setPreferredSize(new Dimension(80,20));
occtext = new JTextField();
occtext.setColumns(20);
okButton = new JButton("OK");
Border inner = BorderFactory.createTitledBorder("Add Person : ");
Border outer = BorderFactory.createEmptyBorder(5,5,5,5);
setBorder(BorderFactory.createCompoundBorder(inner,outer));
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.gridx …Run Code Online (Sandbox Code Playgroud) preferredsize ×10
java ×9
swing ×9
jtable ×3
autolayout ×1
ios ×1
java-9 ×1
jdesktoppane ×1
jdialog ×1
jeditorpane ×1
jframe ×1
jlist ×1
jscrollpane ×1
jtableheader ×1
jtextfield ×1
jviewport ×1
layout ×1
tablecolumn ×1