プログラマメモ2 - programmer no memo2

[java]ドラッグして動かせるパネル 2009/02/04
2009/02/04



swingxのDropShadowBorderをためしてみました。
あわせて、ドラッグして動かせるパネルです。
パネルにイメージファイルをドロップできるようにしてみました。

コンポーネントを置くコンテナのレイアウトマネジャーをnullにすると簡単に実現できますね。
コンポーネントを置けるとコンポーネントにいろいろリスナーを設定したり効果をつけやすいので、重宝するかも。


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.TransferHandler;

import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.border.DropShadowBorder;

public class Test_drop_shadow_border {

static JXPanel createDragablleJPanel() {
return new JXPanel() {

@Override
protected void paintComponent(Graphics g) {
if (image != null) {
Insets insets = getBorder().getBorderInsets(this);

g.drawImage(image, insets.top, insets.left, getWidth()
- (insets.left + insets.right), getHeight()
- (insets.top + insets.bottom), null);
g.setColor(Color.WHITE);
g.drawRect(insets.top, insets.left, getWidth()
- (insets.left + insets.right), getHeight()
- (insets.top + insets.bottom));
}
super.paintComponent(g);
}

{
setOpaque(false);
setPreferredSize(new Dimension((int)(200*1.33), 200));
setSize(new Dimension((int)(200*1.33), 200));
DropShadowBorder border = new DropShadowBorder(Color.DARK_GRAY,
20, .2f, 12, false, false, true, true);
setLocation(100, 10);
setBorder(border);

setTransferHandler(new TransferHandler() {
@Override
public boolean importData(TransferSupport support) {
DataFlavor[] dataFlavors = support.getDataFlavors();

for (DataFlavor dataFlavor : dataFlavors) {
// System.out.println(dataFlavor);
// System.out.println(dataFlavor
// .getDefaultRepresentationClass());

if (dataFlavor.isFlavorJavaFileListType()) {

Object object;
try {
object = support.getTransferable()
.getTransferData(dataFlavor);
List list = (List) object;
for (Object o : list) {
if (o instanceof File) {
image = ImageIO.read((File) o);
repaint();
break;
}
}
// System.out.println(object.getClass());

} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}
return true;
}

@Override
public boolean canImport(TransferSupport support) {
return true;
}

});
addMouseMotionListener(new MouseAdapter() {

{
addMouseListener(this);
}
Point origin = null;

boolean isPressed = false;

@Override
public void mouseReleased(MouseEvent e) {
isPressed = false;
origin = null;
}

@Override
public void mousePressed(MouseEvent e) {
isPressed = true;
origin = e.getPoint();
}

@Override
public void mouseDragged(MouseEvent e) {
// System.out.println(e);
if (!isPressed)
return;
Point nowPoint = e.getPoint();
int dx = nowPoint.x - origin.x;
int dy = nowPoint.y - origin.y;
setLocation(getX() + dx, getY() + dy);
}

});//

}

Image image;

};// return end...
}

public static void main(String[] args) {

JFrame frame = new JFrame() {
{
getContentPane().add(new JPanel() {
{
setLayout(null);
setBackground(Color.LIGHT_GRAY);
setPreferredSize(new Dimension(200, 200));

add(createDragablleJPanel());
add(createDragablleJPanel());
add(createDragablleJPanel());
add(createDragablleJPanel());
add(createDragablleJPanel());
add(createDragablleJPanel());
add(createDragablleJPanel());
add(createDragablleJPanel());
add(createDragablleJPanel());
}

});
}
};
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setAlwaysOnTop(true);
frame.setVisible(true);
}

}

org.jdesktop.animation.timing.interpolation.PropertySetterを使ってpainterのプロパティを変化させようとした。 2008/08/17

org.jdesktop.swingx.painterを使って色が変化するエフェクトをつけたいので、いろいろ調べています。




timingframeworkを使うと簡単にアニメーションとかできそうなので、試しつつ、org.jdesktop.animation.timing.interpolation.PropertySetterを使ってpainterのプロパティを変化させようとしたのですが、どうも値は変更されているが、画面の再描画がされない。

具体的には、CheckerboardPainterの色をマウスオーバー時に変更したい。
JXPanelにマウスがのっかると色が黒から青へ変化。ぬけるともとの色にもどる。

Animator animator = PropertySetter.createAnimator(1000, checkerboardPainter,
"LightPaint", Color.BLACK, Color.BLUE);

MouseTrigger mouseTrigger = MouseTrigger.addTrigger(panel, animator,
MouseTriggerEvent.ENTER, true);

上記だとどうもうまくいかない。
windowサイズを変えたりとかするといろが変わってくれたりした。
※osx上で。

で、考えたのは、painter上のpropertyが変更されたというイベントを受け取ったらpanelにrepaintさせるという方法。

checkerboardPainter.addPropertyChangeListener(new PropertyChangeListener(){
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("***");
panel.repaint();
}});


できたけど、もっといい方法を模索中。
panelにpainterを設定してそのpainterからpanelに対して、repainntを走らせるのもなぁ....

ShapePainter - そしてdrop me 2008/08/16

Javaです。swingxです。


BasicStrokeの使い方よくわかないです.....

下記のコードはなんとなくできたのでよろしくないかもです。
背景の市松模様はCheckerboardPainterです。

BasicStrokeからcreateStrokedShapeするとshapeが作れるので、それをShapePainterに渡してます。

static private Painter getPainter() {

CheckerboardPainter cbp = new CheckerboardPainter();

RoundRectangle2D.Double rrd = new RoundRectangle2D.Double(0, 0, 140,
140, 20, 20);

float[] dash = { 18, 15 };
Shape shape = new BasicStroke(10, BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_MITER, 20, dash, 3).createStrokedShape(rrd);

ShapePainter p = new ShapePainter(shape);
p.setAntialiasing(true);
p.setBorderPaint(Color.DARK_GRAY);
p.setFillPaint(Color.DARK_GRAY);


TextPainter textPainter = new TextPainter("Drop me");
Font font = new Font("Arial", Font.BOLD, 24);
textPainter.setAntialiasing(true);
textPainter.setFillPaint(Color.DARK_GRAY);
textPainter.setFont(font);
return (new CompoundPainter(cbp, p, textPainter));
}

Groovy グラフを書いてみる 2008/01/06



Groovy - Graphs
Groovy - SwingXBuilder

SwingXBuilderを使用して、グラフを書いてみます。

SwingXBuilderを使うためには、SwingX自体と、swingxbuilderxxx.jarが必要になります。

下記のリンクでJava Web StartでGroovy Consoleが起動します。
http://deiji.jp/tools/websupport/groovyconsole2/g.jnlp?swingx=true&load=http://deiji.jp/tools/websupport/groovyconsole2/groovy/SwingXBuilder_plot.groovy&autorun=on

角丸にチャレンジ その2 2007/12/14

Javaです。角丸にチャレンジその2です。

角丸いいですよね。角丸が気になりはじめるとあちらこちらに角丸が存在することに気がつきました。

前回:角丸にチャレンジ - プログラマメモ2
前回ためした方法と違う方法で行いました。
clipしてます。java.awt.geom.Areaを使用しています。
java.awt.geom.Areaは使い方によっては柔軟にいろいろな形状がつくれそうです。

※一部にSwingXを使用しています。org.jdesktop.swingx.graphics.GraphicsUtilities

BufferedImage image = GraphicsUtilities
.toCompatibleImage(originalImage);
int w = image.getWidth();
int h = image.getHeight();
BufferedImage round = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = round.createGraphics();
g2.setClip(new Area(new RoundRectangle2D.Double(0, 0, w, h,
arc, arc)));
g2.drawImage(image, 0, 0, null);
g2.dispose();
setImage(round);


Java Web Startにしてみました。
起動して画像をドロップしてください。スライダーで角丸の丸っこさを決めます。







参考
Java No.4〜言語別の習作集〜
AreaClipTestPanel

JXGradientChooserはグラーデーション用のカラーチューザー 2007/12/11

Javaです。SwingXです。

SwingLabs Java™ Desktop Technology

グラーデーション用のカラーチューザーがありました。
org.jdesktop.swingx.JXGradientChooserを使うと、グラーデーションで使える色選択ができそうです。




依存するライブラリがあるので注意。
MultipleGradientPaint.jar

ちなみにGradientってどう訳するでしょうか?階調とかでしょうか。

参考
グラデーションを使ったデザインのやり方 - GIGAZINE

JXImageViewは画像の拡大縮小アプリをつくるのに役に立つと思いました。 2007/12/10

Javaです。SwingXです。

画像の拡大縮小をする簡単なviewerを作成したいと思いました。
はじめ、ScaleFilterを使用して作ろうかなぁと考えて調べものしていました。途中で、SwingXでいいのないかなぁと思いさがしたら、ずばりありました。
org.jdesktop.swingx.JXImageViewです。
このコンポーネントが便利なところをあげてみます。

既にドラッグアンドドロップに対応している。
拡大縮小ようのスケールメソッドが用意されている。
デフォルトで画像を中央表示するようになっているです。

お手軽に画像表示アプリを作成する場合に、重宝すると思います。

SwingLabs Java™ Desktop Technology

JSliderの使い方JSliderクラス - Swing

下記参考までに作成


BeansBindingを勉強するためのメモ 2007/12/09
2008/11/14

The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 295
【コラム】Java API、使ってますか? (6) JavaBeansのプロパティを同期させるバインディングAPI | エンタープライズ | マイコミジャーナル

画面系のアプリケーションでデータと画面を結びつけるパターンは2種類あるかなと思いました。

1.コレクト型(収集タイプ)
2.バインド型

1.の場合は、何かアクションがおきたら、画面からデータをひろい集めて、処理をする。
2.はデータと画面の項目が対になっている。
1.の場合は2.よりちょっと雑な感じがする。すごく大雑把な動きをするイメージ。
と考えている途中。

SwingXのorg.jdesktop.beans.AbstractBeanを使ってBeans Bindingの仕組みを理解していくための準備。

org.jdesktop.beans.AbstractBeanは、non-visualなbeanでもPropertyChangeイベントの仕組みが使えるようにしてくれます。といっても全部自動で何かしてくれるわけではなくて、イベントを発火させるコードは書かないといけないです。

public void setterXxxx(val) {
old = getVal();
this.val = val;
firePropertyChange("val", old, getVal());
}


以下、大雑把なコード
package r;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.jdesktop.beans.AbstractBean;

public class A extends JPanel {

private static final long serialVersionUID = 1L;
private JTextField jTextField = null;
private JCheckBox jCheckBox = null;
private JButton jButton = null;

public A() {
super();
initialize();
}

private void initialize() {
GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
gridBagConstraints2.gridx = 0;
gridBagConstraints2.gridy = 2;
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
gridBagConstraints1.gridx = 0;
gridBagConstraints1.gridy = 1;
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.gridy = 0;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.gridx = 0;
this.setSize(300, 200);
this.setLayout(new GridBagLayout());
this.add(getJTextField(), gridBagConstraints);
this.add(getJCheckBox(), gridBagConstraints1);
this.add(getJButton(), gridBagConstraints2);
}

private JTextField getJTextField() {
if (jTextField == null) {
jTextField = new JTextField();
myBean.addPropertyChangeListener("isChecked",
new PropertyChangeListener() {

public void propertyChange(
PropertyChangeEvent propertychangeevent) {
jTextField.setText("old:"
+ propertychangeevent.getOldValue()
+ " new:"
+ propertychangeevent.getNewValue());
}
});
}
return jTextField;
}

private JCheckBox getJCheckBox() {
if (jCheckBox == null) {
jCheckBox = new JCheckBox();
jCheckBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myBean.setChecked(jCheckBox.isSelected());
}
});
myBean.addPropertyChangeListener("isChecked",
new PropertyChangeListener() {

public void propertyChange(PropertyChangeEvent evt) {
jCheckBox.setSelected(myBean.isChecked());
}
});
}
return jCheckBox;
}

private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
myBean.setChecked(myBean.isChecked() ? false : true);
}
});
}
return jButton;
}

MyBean myBean = new MyBean();

public class MyBean extends AbstractBean {
boolean isChecked = false;

public boolean isChecked() {
return isChecked;
}

public void setChecked(boolean isChecked) {
boolean old = isChecked();
this.isChecked = isChecked;
firePropertyChange("isChecked", old, isChecked());
}

}

}

ストライプ画像を作成してみます。Java Web Start を使って。 2007/12/09
2007/12/09

ブログの背景にストライプを使いたいなと思いました。
ストライプ画像を作成してくれるWebアプリケーションもちらほらありました。

このサイトがとてもよかったです。ストライプにグラーデーションが適用できる!!
Stripemania - Striped background generator

Webアプリケーションといってもサーバー側で処理させるパターンとは別に、JavaのWeb Startのような方法もありますね。

Flashとか使ってもできそうですね。ただしローカル環境にファイルの保存とかしたい場合が...
※最近、いろいろとクライアントサイドで動かせる技術がちらほらでていますね。

SwingXには、ずばりストライプを描くためのPinstripePainterというのがありました。
Painter Tutorial

今回は、このPinstripePainterを利用してWeb Startアプリケーションでストライプ作成のサンプルを作ってみました。

二つあります。

(A)ユーザーのローカル環境にアクセスできない版(ファイルの保存ができません。)


(B)ユーザーのローカル環境にアクセスできる版(ファイルの保存ができます。)起動時にユーザーに証明書の確認がでてきます。信頼できると思ったときだけ実行してください。


saveを押してディレクトリを指定したらそこにstripe.pngというファイルができます。

起動できたら下のような画面がでてくると思います....


実用的ではないです。
適用してみたらうまくいかなかった。

使用しているのは、SwingXで提供されているswingx-0.9.1.jarです。

角丸にチャレンジ 2007/11/03

角丸画像をつくります。javaです。
ドラッグアンドドロップで画像を渡して角丸にした画像を表示してみます。

仕様は
(1)ウインドウ画面を表示します。
(2)任意の画像をドラッグアンドドロップできます。
(3)ドロップされた画像を角丸にして表示します。

いろいろな方法で角丸ができると思いますが、
今回とった方法は、「Filty Rich Clients」のp.166のUsing SrcInを参考にしています。

Filthy Rich Clients: Developing Animated & Graphical Effects for Desktop Java Applications (The Java Series)
Filthy Rich Clients: Developing Animated & Graphical Effects for Desktop Java Applications (The Java Series)
Chet Haase Romain Guy

by G-Tools


まずドロップされた画像のサイズからGraphics生成して角丸レクタングルを作成します。
つぎに、compositeでドロップされた画像と合成します。

BufferedImageをnewして、Graphics2Dを作成する方法はいろいろ応用できそうです。

BufferedImage round = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = round.createGraphics();
// g2.setColor(Color.BLUE);
g2.fillRoundRect(0, 0, w, h, 37, 37);
g2.setComposite(AlphaComposite.SrcIn);
g2.drawImage(droppedImage, 0, 0, null);
g2.dispose();


おまけで、swingxのペインターをいろいろ使っています。

起動した画面


ドロップした画面


角丸の角丸がきれいではないです。

以下、ソースコードです。
package main.kadomaru;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.painter.AbstractLayoutPainter;
import org.jdesktop.swingx.painter.CompoundPainter;
import org.jdesktop.swingx.painter.ImagePainter;
import org.jdesktop.swingx.painter.RectanglePainter;

public class ImagePanel extends JXPanel {
static DataFlavor urlFlavor;
static {
try {
urlFlavor = new DataFlavor(
"application/x-java-url; class=java.net.URL");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

}

DropTarget dropTarget;
BufferedImage droppedImage;
private static final long serialVersionUID = 1L;

public ImagePanel() {
RectanglePainter roundRect = new RectanglePainter(10, 10, 10, 10, 37,
37, true, Color.black, 10, Color.ORANGE);
// roundRect.setAntialiasing(RenderingHints.VALUE_ANTIALIAS_ON);
CompoundPainter compound = new CompoundPainter(roundRect);
setBackgroundPainter(compound);
initialize();
dropTarget = new DropTarget(this, new MyDrop());
}

private void initialize() {
this.setSize(300, 200);
this.setLayout(new GridBagLayout());
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
paintSuggestion(g);
paintDropedImage(g);
}

protected void paintSuggestion(Graphics g) {
if (this.droppedImage != null)
return;
Dimension dimension = this.getSize();
int w = (int) (dimension.getWidth() / 2);
int h = (int) (dimension.getHeight() / 2);
Font font = new Font("", 0, 32);
g.setColor(Color.WHITE);
g.setFont(font);
g.drawString("Drop Image", 18, h);
}

protected void paintDropedImage(Graphics g) {
if (this.droppedImage == null)
return;

int w = droppedImage.getWidth();
int h = droppedImage.getHeight();

BufferedImage round = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = round.createGraphics();
// g2.setColor(Color.BLUE);
g2.fillRoundRect(0, 0, w, h, 37, 37);
g2.setComposite(AlphaComposite.SrcIn);
g2.drawImage(droppedImage, 0, 0, null);
g2.dispose();
ImagePainter painter = new ImagePainter(round,
AbstractLayoutPainter.HorizontalAlignment.CENTER,
AbstractLayoutPainter.VerticalAlignment.CENTER);
// painter.setScaleToFit(true);
painter.setAntialiasing(true);

CompoundPainter cp = new CompoundPainter(painter);
setBackgroundPainter(cp);
}

class MyDrop implements DropTargetListener {
public void dragEnter(DropTargetDragEvent dtde) {
}

public void dragExit(DropTargetEvent dte) {
}

public void dragOver(DropTargetDragEvent dtde) {
}

public void drop(DropTargetDropEvent dtde) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
Transferable transferable = dtde.getTransferable();
// dump(transferable);
boolean gotData = false;
if (transferable.isDataFlavorSupported(urlFlavor)) {
try {
URL url = (URL) transferable.getTransferData(urlFlavor);

BufferedImage tmpImage = ImageIO.read(url);
droppedImage = tmpImage;
repaint();
gotData = true;
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
dtde.dropComplete(gotData);
}
return;
}
}

public void dropActionChanged(DropTargetDragEvent dtde) {
}

public void dump(Transferable transferable) {
DataFlavor[] dataFlavors = transferable.getTransferDataFlavors();
for (int i = 0; i < dataFlavors.length; i++) {
DataFlavor flavor = dataFlavors[i];
System.out.println(flavor);
}
}
}

}

角丸 2006/12/02
2008/11/14

スティーブ・ジョブズ氏は角丸四角形を基本図形に含めることを激しく主張していたvia オレンジニュース


意識していなかったのですが、角丸はあちらこちらでみかけますね。
もっと手軽に角丸を使いたいのですが、なかなか手軽にはいかない部分もあります。
webのデザインでもまだCSSにコーナー用の gif画像を用意したりであったりと 、手間がかかるようです。 javaアプリケーションでもまだ手軽というわけではなさそうですが、 swingxのライブラリを使用すると手軽に表現できそうです。

swingx



サンプルコードはorg.jdesktop.swingx.painterを利用して角丸画像を手軽に作成する方法です。上記の画像を作成します。パラメータを与える入力を部分を作成工夫すればいろいろな角丸な画像をつくれそうですね。


import java.awt.BorderLayout;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestMainForOutRoundPanel extends JFrame {

private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private RoundPanel roundPanel = null;
private JPanel jPanel = null;
private JButton jButton = null;

private RoundPanel getRoundPanel() {
if (roundPanel == null) {
roundPanel = new RoundPanel();
}
return roundPanel;
}

private JPanel getJPanel() {
if (jPanel == null) {
jPanel = new JPanel();
jPanel.setLayout(new GridBagLayout());
jPanel.add(getJButton(), new GridBagConstraints());
}
return jPanel;
}

private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("out");
jButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

BufferedImage bufferedImage = new BufferedImage(roundPanel.getWidth(),
roundPanel.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D graphic = bufferedImage.createGraphics();
roundPanel.paintComponent2(graphic);

try {
ImageIO.write(
bufferedImage,
"png",
new File("filename.png"));
} catch (Exception ee) {
ee.printStackTrace();
}

}
});
}
return jButton;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestMainForOutRoundPanel thisClass = new TestMainForOutRoundPanel();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}

public TestMainForOutRoundPanel() {
super();
initialize();
}

private void initialize() {
this.setSize(474, 343);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getRoundPanel(), BorderLayout.CENTER);
jContentPane.add(getJPanel(), BorderLayout.SOUTH);
}
return jContentPane;
}

} // @jve:decl-index=0:visual-constraint="10,10"


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.RenderingHints;

import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.painter.CompoundPainter;
import org.jdesktop.swingx.painter.RectanglePainter;

public class RoundPanel extends JXPanel {

public RoundPanel() {
RectanglePainter roundRect = new RectanglePainter(10,
10,
10,
10,
37,
37,
true,
Color.black,
10,
Color.ORANGE);
roundRect.setAntialiasing(RenderingHints.VALUE_ANTIALIAS_ON);
CompoundPainter compound = new CompoundPainter(roundRect);
setBackgroundPainter(compound);
}

@Override
protected void paintComponent(Graphics g) {

super.paintComponent(g);
Dimension dimension = this.getSize();
int w = (int) (dimension.getWidth() / 2);
int h = (int) (dimension.getHeight() / 2);
Font font = new Font("", 0, 32);
g.setColor(Color.WHITE);
g.setFont(font);
g.drawString("角丸(round corner)", 18, h);
}

public void paintComponent2(Graphics graphics) {
paintComponent(graphics);
}

}