我有一个JComboBox有一些选项.当我在另一个组件上做出选择时,我正在改变JComboBox的内容.首先我调用该removeAllItems()方法,然后逐个添加我现在需要的字符串.
问题是,默认情况下我有一些选项,其中一个是较大的文本,因此JComboBox获得了正确显示该选项所需的宽度.当我更改JComboBox内容时,该文本选项消失了,现在一个较小的文本给了JComboBox的宽度,所以当我更改内容时它会变小.
我的第一种方法是调用myComboBox.setPreferredSize(myComboBox.getSize()),然后它的尺寸是固定的,但不正确:它的高度和宽度略小一些.我认为这是因为我正在使用Nimbus Look&Feel,而我从该getSize()方法获得的维度是Java默认的Look%Feel给出的维度.
我也试过myCombo.setPreferredSize(new Dimension(myCombo.getHeight(), myCombo.getWidth()))了同样的结果.
我该如何处理这个问题?
我添加了一个代码示例,说明我如何使用布局:
private String[] comboEventDOutputStrings = { "Run", "Stop", "Pause", "Conditioning time", "Deposition time", "Equilibration time", "Measurement time"};
private String[] comboEventDInputStrings = { "Run", "Stop", "Pause"};
// The first String array is the default set of values. It's obvious that the JComboBox will get smaller
// when I change to the second array of contents
//...
JPanel pane = new JPanel(new GridBagLayout());
JPanel jPanelExterno = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 HTML 文件转换为 PDF。整个想法是创建一个包含多个页面的 pdf,用 HTML 文件内容填充第一个页面。目前我正在尝试这样做,代码是:
#include "qprinterexample.h"
#include <QtGui/QApplication>
#include <QTextDocument>
#include <QTextStream>
#include <QFile>
#include <QPrinter>
#include <QDir>
int print(){
const int highQualityDPI = 300;
QDir::setCurrent(QCoreApplication::applicationDirPath());
QFile htmlFile ("ejemplo.htm");
if (!htmlFile.open(QIODevice::ReadOnly | QIODevice::Text)){
return -1;
}
QString htmlContent;
QTextStream in(&htmlFile);
in >> htmlContent;
QTextDocument *document = new QTextDocument();
document->setHtml(htmlContent);
QPrinter printer(QPrinter::HighResolution);
printer.setPageSize(QPrinter::A4);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("output.pdf");
document->print(&printer);
delete document;
return 0;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPrinterExample w;
if(print()<0) return -1;
w.show();
return a.exec(); …Run Code Online (Sandbox Code Playgroud) 由于我正在为平板电脑环境编程,因此某些小部件对于可触摸交互来说太小了。我想让 QSpinBox 按钮特别大。
经过一番搜索,我发现 setStyleSheet 函数出现的唯一方法,但是它并没有很好地解释如何使用它。在这个指向 Qt 参考的链接中,描述了我应该将什么传递给 setStyleSheet 函数,但不清楚我是否可以使用它的一部分,或者即使我只想更改一件事,我也应该使用所有它。
无论如何,使用它的一部分或整个文本,在应用此设置后,我的 QDoubleSpinBox 看起来是默认值。当我在 mi ui 文件中绘制时,它比现在更大。当然,它不是将其背景涂成黄色(只是为了检查它是否正常工作)或使按钮变大。
我正在使用这个功能:
customizeSpinBox(ui.doubleSpinBoxDistanciaLocalizador);
ui.doubleSpinBoxDistanciaLocalizador->setVisible(true);
void MyClass::customizeSpinBox(QDoubleSpinBox *spinBox){
qApp->setStyleSheet("QSpinBox { border: 3px solid red; border-radius: 5px; background-color: yellow; }"
"QSpinBox::up-arrow { border-left: 17px solid none;"
"border-right: 17px solid none; border-bottom: 17px solid black; width: 0px; height: 0px; }"
"QSpinBox::up-arrow:hover { border-left: 17px solid none;"
"border-right: 17px solid none; border-bottom: 17px solid black; width: 0px; height: 0px; }"
"QSpinBox::up-button { width: 80px; height: 77px; background-color: …Run Code Online (Sandbox Code Playgroud) 我正在使用GridBagLayout创建一个简单的GUI,几乎一切顺利,但有这个细节:有两列,左边一个用于标签,另一个用于其他小部件,如JTextArea,我希望第一列对齐到右边.
所以我尝试将锚定属性设置为GridBagConstraints.NORTHEAST或.EAST,并且它们都不起作用.
我的代码如下:
private void createDataPanel() {
data = new JPanel();
data.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
data.setBorder(new TitledBorder("NOTAM proposal parameters"));
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(5, 10, 5, 10);
c.fill = GridBagConstraints.HORIZONTAL;
data.add(new JLabel("Start time (DD-MM-YYYY HH:MM:SS):"), c);
c.gridx++;
long today = System.currentTimeMillis();
startTimePicker = new JXDatePicker(new Date(today));
startTimePicker.setFormats(dateFormatter);
data.add(startTimePicker);
c.gridx = 0;
c.gridy++;
c.anchor = GridBagConstraints.EAST;
data.add(new JLabel("End time (DD-MM-YYYY HH:MM:SS):"), c);
c.gridx++;
c.anchor = GridBagConstraints.CENTER;
long tomorrow = today + 86400000;
endTimePicker …Run Code Online (Sandbox Code Playgroud) 我正在寻找在C++中解析二进制消息的任何示例库.大多数人要求读取二进制文件或在套接字中接收的数据,但我只需要解码一组二进制消息.有人提到了boost :: spirit,但我找不到合适的例子来满足我的需求.
例如:9A690C12E077033811FFDFFEF07F042C1CE0B704381E00B1FEFFF78004A92440
其中前8位是前同步码,接下来是6位msg ID(0到63之间的整数),接下来的212位是数据,最后24位是CRC24.
所以在这种情况下,msg 26,我必须从212个数据位获取这些数据:
编辑:我需要在位级操作,因此memcpy不是一个好的解决方案,因为它复制了许多字节.要获得第一个4位整数值,我应该从一个字节获得2位,从下一个字节获得另外2位,移位每一对并组成.我要求的是一种更优雅的方法来提取值,因为我有大约20种不同的消息,并希望达到一个通用的解决方案来解析它们的位级别.
等等.
你知道os可以轻松实现这个吗?
我还发现了其他使用static_cast的Q/A. 我用Google搜索,并且对于推荐这种方法的每个人,还有另一个关于端序的警告.由于我已经有了我的消息,我不知道这样的警告是否适用于我,或者只是用于套接字通信.
编辑:提升:dynamic_bitset看起来很有希望.任何使用它的帮助?
我刚刚从这个Q/A中发现结构在C++中是可继承的,但它是一个好的实践,还是更适合使用类?哪种情况更可取,哪种情况不适合?
我从来没有需要这个,但现在我有一堆不同类型但经度相同的消息.我在char数组中使用二进制文件,我只是将它们与memcpy一起复制到结构中以填充其字段(我不知道是否甚至可以使用std :: copy).
我想能够使用公共头继承基础结构中的每个结构都很棒,这就是我搜索它的原因.所以第二个问题是:如果我用类做这个,是否可以从缓冲区到类中执行memcpy(或std:copy)?
我想让我的 TextView 垂直滚动。我读过“在Android中使TextView可滚动”,但由于我不知道最终设备的屏幕尺寸,所以我不知道应该为最大行数设置哪个值。
还有其他方法可以实现任何屏幕尺寸的滚动吗?
我的 XML 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fillViewport="true"
android:layout_weight="1.0">
<TextView
android:id="@+id/consola"
android:layout_width="fill_parent"
android:layout_height="match_parent"/>
</ScrollView>
<EditText
android:id="@+id/comando"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.0"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.0">
<Button
android:text="Conectar"
android:id="@+id/boton_conectar"
android:layout_width="wrap_content"
android:layout_weight="0.5"
android:layout_height="wrap_content">
</Button>
<Button
android:text="Enviar"
android:id="@+id/boton_enviar"
android:layout_width="wrap_content"
android:layout_weight="0.5"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud) 我有一个JTextArea,只需要接受数字.这是我的代码:
DocumentFilter onlyNumberFilter = new AxisJTextFilter();
final JTextArea areaTextoXMin = new JTextArea(String.valueOf(xMin));
((AbstractDocument)areaTextoXMin.getDocument()).setDocumentFilter(onlyNumberFilter);
Run Code Online (Sandbox Code Playgroud)
适用于正数,但不适用于负数.我该如何解决这个问题?
编辑:对不起,AxisJTextFilter是在互联网上找到的,我忘记了.它的代码是:
import javax.swing.text.*;
import java.util.regex.*;
public class AxisJTextFilter extends DocumentFilter
{
public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException
{
StringBuilder sb = new StringBuilder();
sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.insert(offset, text);
if(!containsOnlyNumbers(sb.toString())) return;
fb.insertString(offset, text, attr);
}
public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException
{
StringBuilder sb = new StringBuilder();
sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.replace(offset, offset + length, text); …Run Code Online (Sandbox Code Playgroud) 我有一个表来显示值,在这个表中用户可以选择一行,但不能更改其内容.我的代码是:
JTable tablaCurvas1 = new JTable();
TableCellRenderer tableRender = new SubtractTableRenderer();
tablaCurvas1.setDefaultRenderer(Object.class, tableRender);
tablaCurvas1.setModel(new DefaultTableModel(rowData, columnNames){
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
return false; //So I make every cell non-editable
}
});
JScrollPane scrollPane = new JScrollPane(tablaCurvas1);
tablaCurvas1.setFillsViewportHeight(true);
tablaCurvas1.setPreferredScrollableViewportSize(new Dimension(200,100));
pane.add(scrollPane,c);
Run Code Online (Sandbox Code Playgroud)
但是当我点击它们时,现在不会选择表行.我该怎么解决这个问题?
我有一个具有日志记录功能的脚本,但它停止工作(日志记录,而不是脚本)。我写了一个小例子来说明问题:
import logging
from os import remove
from os.path import exists
def setup_logger(logger_name, log_file, level=logging.WARNING):
# Erase log if already exists
if exists(log_file):
remove(log_file)
# Configure log file
l = logging.getLogger(logger_name)
formatter = logging.Formatter('%(message)s')
fileHandler = logging.FileHandler(log_file, mode='w')
fileHandler.setFormatter(formatter)
streamHandler = logging.StreamHandler()
streamHandler.setFormatter(formatter)
l.setLevel(level)
l.addHandler(fileHandler)
l.addHandler(streamHandler)
if __name__ == '__main__':
setup_logger('log_pl', '/home/myuser/test.log')
log_pl = logging.getLogger('log_pl')
log_pl.info('TEST')
log_pl.debug('TEST')
Run Code Online (Sandbox Code Playgroud)
在脚本的末尾,创建了文件 test.log,但它是空的。
我错过了什么?