2014年11月02日

VirtualBoxにCentOS7をインストールする

VirtualBox4.3.12 にCentOS7をインストールしました。

1. VirtualBoxにCentOS6.5をインストール

 基本的にCentOS6.5と同じですね。
 途中のメニュー形式はだいぶ変わってますけど。

 ソフトウェア選択画面で 「開発およびクリエイティブワークステーション」 を選択しました。

2. Guest Additionsをインストールする

 VirtualBoxメニュー「デバイス」>「Guest AdditionsのCDイメージを挿入」を選択。

 # cd /run/media/xxxx/VBOXADDITIONS_4.3.12_93733
 # sh ./VBoxLinuxAdditions.run

 ↑を実行したところ
 「Building the main Guest Additions module」 で 「失敗」 となりました。

 /var/log/vboxadd-install.log に
 /lib/modules/3.10.0-123.el7.x86_64/build/include/linux/version.h がない

 ってエラーログが出力されてました。

 /usr/include/linux/version.h をコピーしたけど、相変わらずエラーは出てます。

 /tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c でもエラーが出てたのでググっていたら、ソース修正しないといけないらしく・・・

 # cd /opt/VBoxGuestAdditions-4.3.12/src/vboxguest-4.3.12/vboxguest/r0drv/linux
 # vi memobj-r0drv-linux.c
  1536, 1541行目
   変更前 ~ KERNEL_VERSION(3, 13, 0)
   変更後 ~ KERNEL_VERSION(3, 10 0)
 
   ※ uname -r の実行結果は3.10.0 ・・・

 ソース修正したら
 # /etc/init.d/vboxadd setup
 を実行し、無事にインストールできました。
 再起動してフルスクリーンにできることも確認。

 なお、ここでまた
 # sh ./VBoxLinuxAdditions.run を実行してしまうと、memobj-r0drv-linux.c が修正前の状態に戻ってしまうので要注意です。
   

Posted by yoka3 at 23:02Comments(2)VirtualBox | CentOS

2014年10月14日

CentOS5.2のyumでプロキシ認証を通す際にハマッタこと

会社で使ってるVirtualBoxでCentOS5.2の環境を構築する必要が出たので、作業にとりかかりました。

CentOS5.2のインストールはすんなり完了。
vsftpdをyumでインストールするために、/etc/yum.confに
proxy=~:8080
proxy_username=~
proxy_password=~
を追加設定したのですが、yumを実行すると

urlopen error nonnumeric port:8080?

ってエラー・・・

しばらく原因わからず途方に暮れました。

が・・・
ネットさ迷ってるうちに、ふと気になった点があり

proxy=~:8080/ ←最後にスラッシュ

としてみたら
成功。

CentOS6.5ではスラッシュ要らなかったのに・・・
あっけない結果でした。  

Posted by yoka3 at 22:00Comments(0)CentOS 

2014年09月23日

[Java] JTable::テーブルに文字列以外の部品を置いてみる

前回の記事で、何の細工もせずにテーブルにいろいろな部品を配置しようとしたら、文字列が表示されてしまいました。
いろいろ勉強させてもらって、なんとか期待する結果になりました。


public class SampleJTable03Main extends JFrame {

private static final long serialVersionUID = -8784402640069368168L;

private static final String HEADER_TITLE[] = {"Column01", "Column02", "Column03", "Column04", "Column05"};

private DefaultTableModel defaultTableModel = new DefaultTableModel(HEADER_TITLE, 5);

private JRadioButton radioButton = new JRadioButton("RadioButton");
private JCheckBox checkBox = new JCheckBox("CheckBox");
private JButton button = new JButton("Button");
private JComboBox<String> comboBox = new JComboBox<String>();

private JPanel buttonPanel = new JPanel();
private JPanel comboBoxPanel = new JPanel();


public static void main(String[] args) {
SampleJTable03Main sampleJTable03 = new SampleJTable03Main("SampleJTable03");

sampleJTable03.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sampleJTable03.setVisible(true);
}

SampleJTable03Main(String title){
super();
this.setTitle(title);
this.setBounds(10, 10, 470, 220);

comboBox.addItem("item01");
comboBox.addItem("item02");
comboBox.addItem("item03");

buttonPanel.add(button);
comboBoxPanel.add(comboBox);

defaultTableModel.setValueAt(radioButton, 0, 0);
defaultTableModel.setValueAt(checkBox, 0, 1);
defaultTableModel.setValueAt(buttonPanel, 0, 2);
defaultTableModel.setValueAt(comboBoxPanel, 0, 3);
defaultTableModel.setValueAt("あいうえお", 0, 4);

SampleJTable03 sampleJtable03 = new SampleJTable03(defaultTableModel);
JScrollPane jScrollPane = new JScrollPane(sampleJtable03);
jScrollPane.setPreferredSize(new Dimension(450, 170));

JPanel jPanel = new JPanel();
jPanel.add(jScrollPane);

this.add(jPanel, BorderLayout.CENTER);
}
}



public class SampleJTable03 extends JTable {

private static final long serialVersionUID = 6433327646355529652L;

SampleJTable03(DefaultTableModel defaultTableModel) {
super(defaultTableModel);
}

SampleTableCellRenderer03 sampleTableCellRenderer = new SampleTableCellRenderer03();
SampleTableCellEditor03 sampleTableCellEditor = new SampleTableCellEditor03();

@Override
public TableCellRenderer getCellRenderer(int row, int column) {
TableCellRenderer tableCellRenderer;
Object object = this.getValueAt(row, column);

if(object instanceof JComponent) {
tableCellRenderer = sampleTableCellRenderer;
}
else {
tableCellRenderer = super.getCellRenderer(row, column);
}

return tableCellRenderer;
}

@Override
public TableCellEditor getCellEditor(int row, int column) {
TableCellEditor tableCellEditor;
Object object = this.getValueAt(row, column);

if(object instanceof JComponent) {
tableCellEditor = sampleTableCellEditor;
}
else {
tableCellEditor = super.getCellEditor(row, column);
}

return tableCellEditor;
}
}


独自なエディタを作ります。

public class SampleTableCellEditor03 extends AbstractCellEditor implements TableCellEditor {

/*
* extends DefaultCellEditorだと
* 「デフォルトコンストラクター未定義だから明示的コンストラクタ定義せよ」
* ってエラーになる。
*
* DefaultCellEditor は extends AbstractCellEditor, implement TableCellEditor, TreeCellEditor らしい。
*
*/
private static final long serialVersionUID = -2553623250489332629L;

protected JComponent component = null;

@Override
public Object getCellEditorValue() {
return component;
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
component = (JComponent)value;
return component;
}
}




public class SampleTableCellRenderer03 extends DefaultTableCellRenderer {

private static final long serialVersionUID = -8005183308273475843L;

// 行の高さ
private int rowHeight = 0;

SampleTableCellRenderer03() {
super();
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

JComponent component = (JComponent)value;

// 一番高さのあるコンポーネントに合わせて行の高さを設定する。
Dimension dimension = component.getPreferredSize();
if(dimension.height > rowHeight) {
table.setRowHeight(dimension.height);
rowHeight = dimension.height;
}

return component;
}
}


実行結果
 部品が乗っかったセルの背景色は何もいじってません。
 img20140923

  

Posted by yoka3 at 22:30Comments(0)Java 

2014年09月12日

[Java] JTble::何の細工もせず文字列以外の部品を置いてみる

何の細工もしないで、テーブルにラジオボタンやチェックボックス等、文字列以外のコンポーネントを配置しようとした場合にどうなるか・・・以下サンプル(Java version1.8)です。

レンダラは 以前作ったSampleTableCellRenderer02 を使ってます。


public class SampleJTable04Main extends JFrame {

private static final long serialVersionUID = -7554849460806351373L;

private static final String HEADER_TITLE[] = {"Column01", "Column02", "Column03", "Column04", "Column05"};

private JRadioButton radioButton = new JRadioButton("RadioButton");
private JCheckBox checkBox = new JCheckBox("CheckBox");
private JButton button = new JButton("Button");
private JComboBox<String> comboBox = new JComboBox<String>();


public static void main(String[] args) {
SampleJTable04Main sampleJTable01 = new SampleJTable04Main("SampleJTable02");

sampleJTable01.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sampleJTable01.setVisible(true);
}

SampleJTable04Main(String title){
this.setTitle(title);
this.setBounds(10, 10, 470, 120);

DefaultTableModel defaultTableModel = new DefaultTableModel(HEADER_TITLE, 5);

defaultTableModel.setValueAt(radioButton, 0, 0);
defaultTableModel.setValueAt(checkBox, 0, 1);
defaultTableModel.setValueAt(button, 0, 2);
defaultTableModel.setValueAt(comboBox, 0, 3);
defaultTableModel.setValueAt("あいうえお", 0, 4);

JTable jTable = new JTable(defaultTableModel);

JScrollPane jScrollPane = new JScrollPane(jTable);
jScrollPane.setPreferredSize(new Dimension(450, 70));

JPanel jPanel = new JPanel();
jPanel.add(jScrollPane);

this.add(jPanel, BorderLayout.CENTER);

// レンダラは以前作ったものを使用
jTable.setDefaultRenderer(Object.class, new SampleTableCellRenderer02());
}
}

実行結果
 わかりやすいように1列目だけ幅を広げてます。期待する部品は配置されず、文字列となって表示されてしまいました。
img20140912_01


期待する部品を置けるようにしたサンプルは次回・・・
いろいろ調べてますが、メンドイんですねぇ。。。
もっと簡単にできないものなんでしょうか。。。
  

Posted by yoka3 at 22:00Comments(0)Java 

2014年09月01日

[Java] JTable::セルの背景色を変える

セル背景色を変えるには
 DefaultTableCellRenderer.getTableCellRendererComponent()
をオーバーライドすればいいようです。

Sample: (Java version 1.8)
 ・選択行を赤色に。
 ・クリックした(フォーカスが当たった)セルを黄色に。
 ・行番号1/列番号1のセルを青色に。


public class SampleJTable02Main extends JFrame {

private static final long serialVersionUID = -5294540159789000687L;

private static final String HEADER_TITLE[] = {"Column01", "Column02", "Column03", "Column04"};

public static void main(String[] args){
SampleJTable02Main sampleJTable01 = new SampleJTable02Main("SampleJTable02");

sampleJTable01.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sampleJTable01.setVisible(true);
}

SampleJTable02Main(String title){
this.setTitle(title);
this.setBounds(10, 10, 370, 120);

DefaultTableModel defaultTableModel = new DefaultTableModel(HEADER_TITLE, 5);
for(int row=0; row < 5; row++) {
defaultTableModel.setValueAt(row, row, 0);
}

// テーブルモデルを指定してJTable生成
JTable jTable = new JTable(defaultTableModel);

// スクロールペインにはめる
JScrollPane jScrollPane = new JScrollPane(jTable);
jScrollPane.setPreferredSize(new Dimension(350, 70));

JPanel jPanel = new JPanel();
jPanel.add(jScrollPane);

//フレームのContent Paneに部品セット
//this.getContentPane().add(jPanel, BorderLayout.CENTER);
this.add(jPanel, BorderLayout.CENTER);

// DefaultTableCellRendererを継承した独自のレンダラをセット
jTable.setDefaultRenderer(Object.class, new SampleTableCellRenderer02());
}
}



public class SampleTableCellRenderer02 extends DefaultTableCellRenderer {

private static final long serialVersionUID = -4100672856859272722L;

SampleTableCellRenderer02() {
super();
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

/*
* どういう呼ばれ方をしてるのか確認するための出力文
* 目に見えるセルだけ毎度、描画しているらしい
* スクロールさせると、それがわかる
*/
System.out.println("row:" + row + " /column:" + column + " /selected:" + isSelected + " /focus:" + hasFocus + " /value:" + value);

// 選択されている行を赤色にする
if(isSelected) {
this.setBackground(Color.RED);
}
else {
this.setBackground(table.getBackground());
}

// フォーカスが当たっているセルを黄色にする
if(hasFocus) {
this.setBackground(Color.yellow);
}

// 行番号=1/列番号=1のセルを青色にする
if((row == 1) && (column == 1)) {
this.setBackground(Color.BLUE);
}

return this;
}
}


SampleTableCellRenderer02の18行目の出力を見てみます。

1. ウィンドウ表示直後
 左上から1セルずつ呼ばれている。
 なお、目に見えてる3行分だけ呼ばれ、4行目以降は呼ばれていない。

img20140901_01

 row:0 /column:0 /selected:false /focus:false /value:0
 row:0 /column:1 /selected:false /focus:false /value:null
 row:0 /column:2 /selected:false /focus:false /value:null
 row:0 /column:3 /selected:false /focus:false /value:null
 row:1 /column:0 /selected:false /focus:false /value:1
 row:1 /column:1 /selected:false /focus:false /value:null
 row:1 /column:2 /selected:false /focus:false /value:null
 row:1 /column:3 /selected:false /focus:false /value:null
 row:2 /column:0 /selected:false /focus:false /value:2
 row:2 /column:1 /selected:false /focus:false /value:null
 row:2 /column:2 /selected:false /focus:false /value:null
 row:2 /column:3 /selected:false /focus:false /value:null

2. カーソルを行番号2/列番号2へ移動(選択状態とはしない)
 カーソル移動しただけでも呼ばれている。

img20140901_02

 row:2 /column:2 /selected:false /focus:false /value:null 

3. 続けてカーソルを行番号1/列番号2へ移動(選択状態とはしない)

img20140901_03

 row:1 /column:2 /selected:false /focus:false /value:null

4. 行番号1/列番号2のセルを選択

img20140901_04

 row:1 /column:0 /selected:true /focus:false /value:1
 row:1 /column:1 /selected:true /focus:false /value:null
 row:1 /column:2 /selected:true /focus:true /value:null
 row:1 /column:3 /selected:true /focus:false /value:null

5. 1行だけスクロール
 この場合は3行分呼ばれるわけではないのか・・・

img20140901_05

 row:2 /column:0 /selected:false /focus:false /value:2
 row:2 /column:1 /selected:false /focus:false /value:null
 row:2 /column:2 /selected:false /focus:false /value:null
 row:2 /column:3 /selected:false /focus:false /value:null
 row:3 /column:0 /selected:false /focus:false /value:3
 row:3 /column:1 /selected:false /focus:false /value:null
 row:3 /column:2 /selected:false /focus:false /value:null
 row:3 /column:3 /selected:false /focus:false /value:null

6. さらに1行だけスクロール

img20140901_06

 row:3 /column:0 /selected:false /focus:false /value:3
 row:3 /column:1 /selected:false /focus:false /value:null
 row:3 /column:2 /selected:false /focus:false /value:null
 row:3 /column:3 /selected:false /focus:false /value:null
 row:4 /column:0 /selected:false /focus:false /value:4
 row:4 /column:1 /selected:false /focus:false /value:null
 row:4 /column:2 /selected:false /focus:false /value:null
 row:4 /column:3 /selected:false /focus:false /value:null
  

Posted by yoka3 at 22:00Comments(0)Java