JFrame +自定义LayoutManeger +使用Graphisc2D(旋转)

时间:2015-12-09 13:41:02

标签: java swing layout paint paintcomponent


我正在使用自定义布局管理器的项目。我的目标是将所有组件旋转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°) 。


我希望这是可以理解的,我做了很多努力,以了解哪里可能是问题,并试图找出解决方案,但它的行为真的很奇怪。因此,我希望有更多经验的人可以帮助我摆脱困境并向我展示道路。

1 个答案:

答案 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();
    }
}

此方法保持原始图形不变,至少允许父组件正常呈现。旋转图形仍然很棘手,并且在渲染过程中可能会产生意想不到的副作用,但至少这些效果现在都小心地限制在旋转组件的子节点上。