我正在使用自定义布局管理器的项目。我的目标是将所有组件旋转180°。
我有一些由JFrame组成的屏幕。我还有一些LayoutHandler,它定义了一些布局层。每个层都是LayerLayout的实例,它从java.awt实现LayerManager2
流程可能是这样的:
我有JFrame,代表显示器。这个JFrame有一些默认的contentpane。应用程序设置为此contentpane Layout,由LayerHandler表示:
JLabel hwLabel = new JLabel("Hello world.");
hwLabel.setVisible(true);
graphicalDisplayJFrame.add(hwLabel);
layerHandler只是以某种方式管理LayerLayouts层,这些层实现了java.awt中的LayerLayout2。所以它看起来像布局布局或者它是什么。我在创建自定义布局方面经验不足。
我的情况显示了JFrame的创建。
def import
require 'csv'
file = params[:file]
CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
@prod = Spree::Product.new()
@prod.name = row["name"]
@prod.shipping_category_id = row["shipping_category_id"]
@prod.description = row["description"]
@prod.available_on = row["available_on"]
@prod.meta_description = row["meta_description"]
@prod.meta_keywords = row["meta_keywords"]
@prod.tax_category_id = row["tax_category_id"]
@prod.shipping_category_id = row["shipping_category_id"]
@prod.promotionable = row["promotionable"]
@prod.meta_title = row["meta_title"]
@prod.featured = row["featured"]
@prod.supplier_id = row["supplier_id"]
@prod.master.price = row["master_price"]
@prod.save!
@var = Spree::Variant.create(cost_price: row["cost_price"], is_master:1, product_id: @prod.id, sku: row["sku"])
if @var.errors.present?
render json: @var #.errors and return
end
@price = Spree::Price.create(variant_id: @var.id)
if @price.errors.present?
render json: @price #.errors and return
end
end
redirect_to admin_products_path, notice: "products imported."
end
第一部分应该使旋转180°,但它不会,即使我在graphicalDisplayJFrame上调用重绘。但是,当我添加这个:
{{1}}
我引起奇怪的事情。 JFrame及其上的所有组件意外旋转180°。但它唯一的静态行为,因为显示有一些文本组件,当更改它们上面的文本时,它再次以非旋转方式呈现。
所以问题是为什么会发生这种情况?
如果我把它分成两部分:
a)为什么JFrame上的Graphics2D不会影响其内容窗格中的子组件。为什么它只在我添加没有意义的JLabel时才起作用,但它只是实验导致我想要的东西(=重新绘制正确的旋转)。
b)我应该以某种方式应用rotation =>类似于覆盖在JFrame的contentPane上添加的每个组件上的paint方法。但我该怎么办呢?上面描述的布局处理程序只是管理一堆布局(可能是自定义布局的层,从java.awt实现LayoutManager2),它只是提供放在布局上的组件并将它们放在内容窗格上。所以问题可能应该是我想要实现自定义疼痛的地方,这意味着应用旋转(这是代码g2d.rotate的一部分(Math.PI,anchorx,anchory); //旋转180°) 。
我希望这是可以理解的,我做了很多努力,以了解哪里可能是问题,并试图找出解决方案,但它的行为真的很奇怪。因此,我希望有更多经验的人可以帮助我摆脱困境并向我展示道路。
答案 0 :(得分:0)
您正在非常奇怪的地方应用旋转。 Graphics2D.rotate()仅适用于旋转调用后绘制的内容,但在调用super之后,您的paint-overides会旋转。
至于为什么添加标签会导致旋转,很难在不看整个代码的情况下判断。可能是部分重画的影响。
您应该不要修改要素,例如图形转换或传递给绘图方法的图形的旋转。它有可能以意想不到的方式影响父组件绘制,并且效果可以根据JRE版本轻松更改。而是创建一个 new 图形以传递给您的子组件:
@Override
public void paintChildren(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
try {
g2d.rotate(Math.PI, anchorx, anchory);
super.paintChildren(g2d);
} finally {
g2d.dispose();
}
}
此方法保持原始图形不变,至少允许父组件正常呈现。旋转图形仍然很棘手,并且在渲染过程中可能会产生意想不到的副作用,但至少这些效果现在都小心地限制在旋转组件的子节点上。