- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前我正在尝试添加一个与按钮一样大的图标(添加到GridBagLayout
)。我想将图标缩放到按钮的大小,但我的按钮显示其大小为 0。
我尝试打印出按钮的大小(在创建按钮之后以及添加按钮之后)。它总是给我 0,因此出现 ArgumentException
(宽度 (0) 和高度 (0) 必须非零)。
此外,我想动态调整字体大小,与按钮一样大(尚未实现,但也不起作用,因为按钮没有给出其大小)。有人有使用 LayoutManager 动态调整大小的解决方案吗?也许有一种方法可以获取像元大小,然后将图像缩放到像元大小?
这是我的测试代码:
import javax.swing.*;
import java.awt.*;
public class TestResize extends JFrame {
private Container cp;
private JPanel levelPane;
private GridBagConstraints gbc = new GridBagConstraints();
public TestResize() {
super();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 200;
int frameHeight = 200;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setTitle("temp");
setResizable(false);
cp = getContentPane();
cp.setLayout(new BorderLayout());
createLevelMenu();
setVisible(true);
} // end of public temp
public static void main(String[] args) {
new TestResize();
} // end of main
public void createLevelMenu(){
if (levelPane == null){
levelPane = new JPanel(new GridBagLayout());
gbc.fill = GridBagConstraints.NONE;
JButton back = new JButton();
back.setOpaque(false);
back.setBackground(null);
back.setBorder(null);
addObject(0,0,1,1,GridBagConstraints.FIRST_LINE_START,back);
Image img = (new ImageIcon("Content/Graphics/UI/returnIcon.png")).getImage().getScaledInstance(back.getWidth(),back.getHeight(),Image.SCALE_SMOOTH);
back.setIcon(new ImageIcon(img));
JPanel menu = new JPanel(new BorderLayout());
menu.setBackground(Color.RED);
JLabel l = new JLabel("Demo");
l.setFont(l.getFont().deriveFont(30)); //Font Size as big as Possible (adjust
l.setHorizontalAlignment(SwingConstants.CENTER);
l.setVerticalAlignment(SwingConstants.CENTER);
menu.add(l,BorderLayout.CENTER);
gbc.fill = GridBagConstraints.BOTH;
addObject(2,2,1,4,GridBagConstraints.CENTER,menu);
JButton info = new JButton("Info");
addObject(3,3,1.25f,1.25f,GridBagConstraints.LAST_LINE_END,info);
cp.add(levelPane, BorderLayout.CENTER);
}
}
public void addObject(int gridX,int gridY, double weightX,double weightY,int anchor, JComponent comp){
gbc.gridx =gridX;
gbc.gridy = gridY;
gbc.weightx = weightX;
gbc.weighty = weightY;
gbc.anchor = anchor;
levelPane.add(comp,gbc);
}
}
最佳答案
I tried to print out the size of the button (after creating it and also after adding it). It always gives me 0 and therefore an ArgumentException (width (0) and height (0) must be non-zero).
是的,这有很多原因
getTopLevelAncestor()
返回的结果不可显示,也不能保证其大小! (在本例中为您的 TestResize
对象)所以这个概念从一开始就是错误的,即使你没有将边框设置为空,大小也将等于边框插入(并且对于所有 api 边框来说都是紧密的!!!即使对于普通的“hi”,字体大小为 5!!!)。
所以在这种情况下你最好的选择(但不是我提到的你的)就是打电话
back.getPreferredSize()
要使其工作(在您的情况下),您必须自己设置图像的起始尺寸,然后将图标设置为按钮时,用户界面将为其提供额外的尺寸。
Also I want to dynamically size the font as big as the button
@AndrewThompson 在他写的答案中指出了一个很好的例子,@trashgod 也很好的例子,所有这些都非常壮观!为此+1。
<小时/>After that ask the Buttons its size and then add the Icon with the same size?
你必须明白,当使用布局管理器时,每个事物的大小都是相对于它的父级的!举个例子图标按钮 --> 级别面板(它是内容 Pane ) --> 根 Pane JLayeredPane
对象 --> 根 Pane 本身 --> 最后是框架!每个东西都会根据父级大小调整大小,但如果父级大小为 0,0,则不要指望子组件的大小会超过这个值!请记住,GridBagLayout
是所有布局中最复杂的,并且它的行为方式可能很奇怪。
以及
的用法component.getWidth();
//and
component.getHeight();
是为了获取“屏幕上”的实际大小,其返回甚至可能与 getSize()
或其他(最大、最小)无关。
因此,使图标与您必须制作的大小相同的最佳方法组件监听器
Icon with the same size
这是一个坏主意,因为如果 L & F 有一个默认的按钮插入,那么您将给它比它需要的更多的东西! 并使用 ComponentListener
您将使其具有调整大小的动画!!
这是你的类的重构版本,ComponentAdapter
是接口(interface) ComponentListener
的实现,它以空的方式实现每个方法,我使用它,所以我不必也实现所有其他方法。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import mdlaf.utils.MaterialImages;
public class TestResize extends JFrame {
private Container cp;
private JPanel levelPane;
private GridBagConstraints gbc = new GridBagConstraints();
public TestResize() {
super();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 200;
int frameHeight = 200;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setTitle("temp");
setResizable(false);
cp = getContentPane();
cp.setLayout(new BorderLayout());
createLevelMenu();
GridBagLayout gbl = (GridBagLayout) levelPane.getLayout();
gbc = gbl.getConstraints(back);
gbc.fill = GridBagConstraints.BOTH;
levelPane.remove(back);
levelPane.add(back, gbc);
back.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
//here you can add an image relative to the new size !!
if (back.getIcon() == null) {
fixIcon();
} else if (back.getIcon().getIconHeight() != back.getHeight() - heightPadding || back.getIcon().getIconWidth() != back.getWidth() - widthPadding) {
fixIcon();
}
}
});
setVisible(true);
} // end of public temp
private int widthPadding;
private int heightPadding;
private void fixIcon() {
Image img = (new ImageIcon(MaterialImages.BACK_ARROW)).getImage().getScaledInstance(back.getWidth() - widthPadding, back.getHeight() - heightPadding, Image.SCALE_SMOOTH);
back.setIcon(new ImageIcon(img));
}
public static void main(String[] args) {
new TestResize();
} // end of main
JButton back;
public void createLevelMenu() {
if (levelPane == null) {
levelPane = new JPanel(new GridBagLayout());
gbc.fill = GridBagConstraints.NONE;
back = new JButton();
back.setOpaque(false);
back.setBackground(null);
back.setBorder(null);
addObject(0, 0, 1, 1, GridBagConstraints.FIRST_LINE_START, back);
JPanel menu = new JPanel(new BorderLayout());
menu.setBackground(Color.RED);
JLabel l = new JLabel("Demo");
l.setFont(l.getFont().deriveFont(30)); //Font Size as big as Possible (adjust
l.setHorizontalAlignment(SwingConstants.CENTER);
l.setVerticalAlignment(SwingConstants.CENTER);
menu.add(l, BorderLayout.CENTER);
gbc.fill = GridBagConstraints.BOTH;
addObject(2, 2, 1, 4, GridBagConstraints.CENTER, menu);
JButton info = new JButton("Info");
addObject(3, 3, 1.25f, 1.25f, GridBagConstraints.LAST_LINE_END, info);
cp.add(levelPane, BorderLayout.CENTER);
}
}
public void addObject(int gridX, int gridY, double weightX, double weightY, int anchor, JComponent comp) {
gbc.gridx = gridX;
gbc.gridy = gridY;
gbc.weightx = weightX;
gbc.weighty = weightY;
gbc.anchor = anchor;
levelPane.add(comp, gbc);
}
}
widthPadding
和 heightPadding
是按钮的 L 和 F 插入的总和,我无法帮助您,您必须自己完成,这是一个L&F依赖。但对于黑客,你可以将 componentResized
方法更改为此(我不鼓励这样做)
public void componentResized(ComponentEvent e) {
//here you can add an image relative to the new size !!
if (back.getIcon() == null) {
back.removeComponentListener(this);
fixIcon();
}
I have already seen this example but I find it a little complicated, so I thought there is maybe a better (easier) solution.
遗憾的是我不这么认为,但是@AndrewThompson的答案似乎很容易学习,我会研究如果我想开始阅读GlyphVector
它很整洁,很简单,并且编码愉快。
关于java - 将按钮中的图标调整为与按钮大小一样大(+使用布局管理器)并使字体与按钮大小一样大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55811248/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!