- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
TL;DR在不同的 DPI 设置上,我的应用程序的组件可能会重叠。为了摆脱这个问题,我想检查组件宽度,更新 UI 后它始终等于 0。问题末尾的简单代码。
基本问题是,在不同的 DPI 设置下,我的程序的不同部分是到达最右边的部分。在较高的 DPI 上,它是动态生成的标签,在较低的 DPI 上,它是固定宽度的文本字段。
我正在使用 SpringLayout 来处理可能更改的 DPI 设置。通过上述描述,我遇到了特定设置组件重叠的问题。
为了克服这个问题,我想检查一个组件的左边缘是否比另一个组件的右边缘更左 +10 个像素,以获得更多空间。
if (labelRight.getX() < (labellist.get(0).getX() + labellist.get(0).getWidth+10)){
//Use one SpringLayout setting for labelRight
} else //Use another SpringLayout setting for labelRight
我认为问题是我在生成组件后检查组件的宽度。用户可以从不同的设置中进行选择,这将改变部分面板内容。 labellist
包含该区域最右侧的标签。
我编写了一个小测试程序来显示宽度检查的问题宽度:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
import javax.swing.UIManager;
public class testsforSO extends JFrame {
private static final long serialVersionUID = -857761460788731909L;
ArrayList<JLabel> lbls = new ArrayList<>();
int lblCount = 6;
JPanel panel = new JPanel();
SpringLayout sl_panel = new SpringLayout();
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
testsforSO frame = new testsforSO();
frame.pack();
frame.setVisible(true);
frame.setSize(500, 500);
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public testsforSO() {
getContentPane().add(panel);
updateUI();
JButton incr = new JButton("Increment here!");
incr.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
for (int i=0; i<=lbls.size()-1; i++){
panel.remove(lbls.get(i));
}
lblCount++;
lbls.clear();
updateUI();
panel.repaint();
panel.revalidate();
System.out.println("Width of slimest label: " + lbls.get(0).getWidth());
System.out.println("Width of widest label : " + lbls.get(lbls.size()-1).getWidth());
}
});
panel.add(incr);
sl_panel.putConstraint(SpringLayout.NORTH, incr, 10, SpringLayout.NORTH, panel);
sl_panel.putConstraint(SpringLayout.EAST, incr, -10, SpringLayout.EAST, panel);
panel.setLayout(sl_panel);
}
private void updateUI(){
for (int i = 0; i <= lblCount; i++) {
String abc = new String();
for (int j = 0; j <= i; j++) {
abc += "xx";
}
JLabel bfrLbl = new JLabel(abc);
lbls.add(bfrLbl);
panel.add(bfrLbl);
}
for (int i = 0; i <= lbls.size() - 1; i++) {
if (i > 0)
sl_panel.putConstraint(SpringLayout.NORTH, lbls.get(i), 8, SpringLayout.SOUTH, lbls.get(i - 1));
else
sl_panel.putConstraint(SpringLayout.NORTH, lbls.get(i), 8, SpringLayout.NORTH, panel);
}
}
}
按下按钮时,用户界面会更新,底部会多一个标签。 SpringLayout 会相应地安装,并且面板会在之后重新验证。但是宽度的输出是 0。为什么会这样?我能做什么呢?
最佳答案
经过进一步调查,我找到了一种正确读取组件宽度的方法:
sl_panel.getConstraint(SpringLayout.WIDTH, lbls.get(0)).getValue();
成功了。与相比,似乎是一个非常庞大的线路
lbls.get(0).getWidth();
不过。
关于java - UI-Update 后 SpringLayout 中组件的宽度等于 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41458862/
我想问SpringLayout是否可以做绝对位置之类的事情,因为我认为当我最大化框架时绝对位置有问题,如果我需要设置,我必须使用什么JMenu 和 JToolBar 以及 JTextField 和 J
我在表单上使用了 SpringLayout,但是如您所见,它的外观并不好(大而且尺寸不佳)! public class t8 extends JFrame { JButton okButton, ca
我在做This例子。我的代码完全相同,但不是得到 我正在获取 谁能解释一下为什么吗? 最佳答案 很可能您正在运行一个不同的项目。运行按钮旁边有一个下拉箭头,单击它并选择要运行的正确项目。 关于java
SpringLayout 号称功能非常强大。我尝试使用 SpringLayout 实现我认为相当简单的布局,但失败得很严重。 减少到最少,我想在我的 JFrame 上并排放置 4 个 JButton:
我正在尝试使用 SpringLayout 实现一个非常简单的 UI(部分原因是,与我在网上找到的大多数教程作者相反,与其他布局管理器相比,我的编码界面非常相似,并且部分原因是我想学习如何使用它)。用户
我正在尝试使用 Swing 在 Java 中创建一个表单,但我在管理布局方面遇到了困难。 我想在对话框的中央有几个带标签的文本字段,并在右下角有“保存”和“关闭”按钮。 将按钮添加到对话框的右下方很简
我需要帮助创建 Java swing 表单。该表单是动态创建的,并要求用户提供各种输入。输入各不相同,可以是文本字段、单选按钮、组合框。我正在尝试确定这种表单的最佳布局。目前,我有类似的东西: JPa
我最近开始使用 Java 进行开发,并且非常享受这段经历。默认的 Java 包加载了有用的东西,并且拥有 Swing 包对创建 GUI 有很大帮助。我决定为我的 LayoutManager 使用 Sp
我的 GridLayout 遇到问题,JTextField 会变宽以适应比初始大小长的条目。另一位遇到此问题的发帖者被告知 SpringLayout 是最简单的解决方案,所以这就是我正在尝试的。然而,
我想将复杂的容器结构作为 SpringLayouts 的组合来管理(一系列独立的 SpringLayout 相互嵌套) 特别是,由包含 JPanel 的主 SpringLayout 管理的 JFram
使用SpringLayout时有没有简单的方法来定义节点的放置速度?我正在使用 JUng 库版本 2.1.1。 我什至创建了一个自己的 SpringLayout 类,以便可以更改任何参数,但更改“Sp
我不知道如何使带有 SpringLayout 的 JPanel 正确计算其首选大小,因为目前它始终是 (0, 0)。我尝试调用 panel.setPreferredSize(layout.prefer
我目前正在制作一个小型应用程序,我需要 Spring Utilities 类,该类扩展“JPanel”,因为它是一个内容 Pane ,但是我需要通过容器获取布局类型,但只有该类/框架使用 spring
我正在使用以下代码使用 SpringLayout 制作 GUI: private void createAndShowGUI() { frame = new JFrame("A GUI");
我有一个 JScrollPane,它有一个使用 SpringLayout 的 View 组件。 final JPanel panel = new JPanel(new SpringLayout());
SpringLayout 的文档说它从 java 1.4 开始就可用,我有大约 7 台旧的 mac,无法升级到任何较新版本的 mac os 10.5,这导致我最多只有 java 1.5.0_30。问题
我有一个卡片布局,可以使用 JComboBox 在面板之间切换。问题是当我重新调整窗口大小时,我里面的面板永远不会改变大小。当我使用 SpringLayout 时,我只需告诉某些东西与边框保持 x 像
TL;DR在不同的 DPI 设置上,我的应用程序的组件可能会重叠。为了摆脱这个问题,我想检查组件宽度,更新 UI 后它始终等于 0。问题末尾的简单代码。 基本问题是,在不同的 DPI 设置下,我的程序
我有一个 JPanel,其中包含另一个 JPanel,我想使用 SpringLayout 在其上放置一个 JButton。但由于某种原因,JButton 未绘制。但是,如果我使用绝对定位而不是布局管理
Oracle Java Swing 文档 layout managers似乎暗示在选择布局管理器时SpringLayout是一个选项。 (“SpringLayout 是一个灵活的布局管理器,专为 GU
我是一名优秀的程序员,十分优秀!